Fix #21089: Do not infer from numeric index signature in Object.values and Object.entries (#21129)

* Fix https://github.com/Microsoft/TypeScript/issues/21089: Do not infer from numeric index signature in Object.values and Object.entries

* Update test
This commit is contained in:
Mohamed Hegazy 2018-01-17 14:16:11 -08:00 committed by GitHub
parent 3c988e8f5a
commit b0d7d5a7ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 289 additions and 45 deletions

View file

@ -3,7 +3,7 @@ interface ObjectConstructor {
* Returns an array of values of the enumerable properties of an object
* @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
*/
values<T>(o: { [s: string]: T } | { [n: number]: T }): T[];
values<T>(o: { [s: string]: T } | ArrayLike<T>): T[];
/**
* Returns an array of values of the enumerable properties of an object
@ -15,7 +15,7 @@ interface ObjectConstructor {
* Returns an array of key/values of the enumerable properties of an object
* @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
*/
entries<T>(o: { [s: string]: T } | { [n: number]: T }): [string, T][];
entries<T>(o: { [s: string]: T } | ArrayLike<T>): [string, T][];
/**
* Returns an array of key/values of the enumerable properties of an object

View file

@ -5,11 +5,30 @@ for (var x of Object.values(o)) {
let y = x;
}
var entries = Object.entries(o);
var entries1 = Object.entries(1);
var entries2 = Object.entries({a: true, b: 2})
var entries3 = Object.entries({})
var entries = Object.entries(o); // [string, number][]
var values = Object.values(o); // number[]
var entries1 = Object.entries(1); // [string, any][]
var values1 = Object.values(1); // any[]
var entries2 = Object.entries({ a: true, b: 2 }); // [string, number|boolean][]
var values2 = Object.values({ a: true, b: 2 }); // (number|boolean)[]
var entries3 = Object.entries({}); // [string, {}][]
var values3 = Object.values({}); // {}[]
var a = ["a", "b", "c"];
var entries4 = Object.entries(a); // [string, string][]
var values4 = Object.values(a); // string[]
enum E { A, B }
var entries5 = Object.entries(E); // [string, any][]
var values5 = Object.values(E); // any[]
interface I { }
var i: I = {};
var entries6 = Object.entries(i); // [string, any][]
var values6 = Object.values(i); // any[]
//// [useObjectValuesAndEntries1.js]
var o = { a: 1, b: 2 };
@ -17,7 +36,24 @@ for (var _i = 0, _a = Object.values(o); _i < _a.length; _i++) {
var x = _a[_i];
var y = x;
}
var entries = Object.entries(o);
var entries1 = Object.entries(1);
var entries2 = Object.entries({ a: true, b: 2 });
var entries3 = Object.entries({});
var entries = Object.entries(o); // [string, number][]
var values = Object.values(o); // number[]
var entries1 = Object.entries(1); // [string, any][]
var values1 = Object.values(1); // any[]
var entries2 = Object.entries({ a: true, b: 2 }); // [string, number|boolean][]
var values2 = Object.values({ a: true, b: 2 }); // (number|boolean)[]
var entries3 = Object.entries({}); // [string, {}][]
var values3 = Object.values({}); // {}[]
var a = ["a", "b", "c"];
var entries4 = Object.entries(a); // [string, string][]
var values4 = Object.values(a); // string[]
var E;
(function (E) {
E[E["A"] = 0] = "A";
E[E["B"] = 1] = "B";
})(E || (E = {}));
var entries5 = Object.entries(E); // [string, any][]
var values5 = Object.values(E); // any[]
var i = {};
var entries6 = Object.entries(i); // [string, any][]
var values6 = Object.values(i); // any[]

View file

@ -16,30 +16,114 @@ for (var x of Object.values(o)) {
>x : Symbol(x, Decl(useObjectValuesAndEntries1.ts, 2, 8))
}
var entries = Object.entries(o);
var entries = Object.entries(o); // [string, number][]
>entries : Symbol(entries, Decl(useObjectValuesAndEntries1.ts, 6, 3))
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>o : Symbol(o, Decl(useObjectValuesAndEntries1.ts, 0, 3))
var entries1 = Object.entries(1);
>entries1 : Symbol(entries1, Decl(useObjectValuesAndEntries1.ts, 7, 3))
var values = Object.values(o); // number[]
>values : Symbol(values, Decl(useObjectValuesAndEntries1.ts, 7, 3))
>Object.values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>o : Symbol(o, Decl(useObjectValuesAndEntries1.ts, 0, 3))
var entries1 = Object.entries(1); // [string, any][]
>entries1 : Symbol(entries1, Decl(useObjectValuesAndEntries1.ts, 9, 3))
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
var entries2 = Object.entries({a: true, b: 2})
>entries2 : Symbol(entries2, Decl(useObjectValuesAndEntries1.ts, 8, 3))
var values1 = Object.values(1); // any[]
>values1 : Symbol(values1, Decl(useObjectValuesAndEntries1.ts, 10, 3))
>Object.values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
var entries2 = Object.entries({ a: true, b: 2 }); // [string, number|boolean][]
>entries2 : Symbol(entries2, Decl(useObjectValuesAndEntries1.ts, 12, 3))
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>a : Symbol(a, Decl(useObjectValuesAndEntries1.ts, 8, 31))
>b : Symbol(b, Decl(useObjectValuesAndEntries1.ts, 8, 39))
>a : Symbol(a, Decl(useObjectValuesAndEntries1.ts, 12, 31))
>b : Symbol(b, Decl(useObjectValuesAndEntries1.ts, 12, 40))
var entries3 = Object.entries({})
>entries3 : Symbol(entries3, Decl(useObjectValuesAndEntries1.ts, 9, 3))
var values2 = Object.values({ a: true, b: 2 }); // (number|boolean)[]
>values2 : Symbol(values2, Decl(useObjectValuesAndEntries1.ts, 13, 3))
>Object.values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>a : Symbol(a, Decl(useObjectValuesAndEntries1.ts, 13, 29))
>b : Symbol(b, Decl(useObjectValuesAndEntries1.ts, 13, 38))
var entries3 = Object.entries({}); // [string, {}][]
>entries3 : Symbol(entries3, Decl(useObjectValuesAndEntries1.ts, 15, 3))
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
var values3 = Object.values({}); // {}[]
>values3 : Symbol(values3, Decl(useObjectValuesAndEntries1.ts, 16, 3))
>Object.values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
var a = ["a", "b", "c"];
>a : Symbol(a, Decl(useObjectValuesAndEntries1.ts, 18, 3))
var entries4 = Object.entries(a); // [string, string][]
>entries4 : Symbol(entries4, Decl(useObjectValuesAndEntries1.ts, 19, 3))
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>a : Symbol(a, Decl(useObjectValuesAndEntries1.ts, 18, 3))
var values4 = Object.values(a); // string[]
>values4 : Symbol(values4, Decl(useObjectValuesAndEntries1.ts, 20, 3))
>Object.values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>a : Symbol(a, Decl(useObjectValuesAndEntries1.ts, 18, 3))
enum E { A, B }
>E : Symbol(E, Decl(useObjectValuesAndEntries1.ts, 20, 31))
>A : Symbol(E.A, Decl(useObjectValuesAndEntries1.ts, 22, 8))
>B : Symbol(E.B, Decl(useObjectValuesAndEntries1.ts, 22, 11))
var entries5 = Object.entries(E); // [string, any][]
>entries5 : Symbol(entries5, Decl(useObjectValuesAndEntries1.ts, 23, 3))
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>E : Symbol(E, Decl(useObjectValuesAndEntries1.ts, 20, 31))
var values5 = Object.values(E); // any[]
>values5 : Symbol(values5, Decl(useObjectValuesAndEntries1.ts, 24, 3))
>Object.values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>E : Symbol(E, Decl(useObjectValuesAndEntries1.ts, 20, 31))
interface I { }
>I : Symbol(I, Decl(useObjectValuesAndEntries1.ts, 24, 31))
var i: I = {};
>i : Symbol(i, Decl(useObjectValuesAndEntries1.ts, 27, 3))
>I : Symbol(I, Decl(useObjectValuesAndEntries1.ts, 24, 31))
var entries6 = Object.entries(i); // [string, any][]
>entries6 : Symbol(entries6, Decl(useObjectValuesAndEntries1.ts, 28, 3))
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>i : Symbol(i, Decl(useObjectValuesAndEntries1.ts, 27, 3))
var values6 = Object.values(i); // any[]
>values6 : Symbol(values6, Decl(useObjectValuesAndEntries1.ts, 29, 3))
>Object.values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
>i : Symbol(i, Decl(useObjectValuesAndEntries1.ts, 27, 3))

View file

@ -10,9 +10,9 @@ var o = { a: 1, b: 2 };
for (var x of Object.values(o)) {
>x : number
>Object.values(o) : number[]
>Object.values : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): T[]; (o: {}): any[]; }
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>values : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): T[]; (o: {}): any[]; }
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>o : { a: number; b: number; }
let y = x;
@ -20,39 +20,143 @@ for (var x of Object.values(o)) {
>x : number
}
var entries = Object.entries(o);
var entries = Object.entries(o); // [string, number][]
>entries : [string, number][]
>Object.entries(o) : [string, number][]
>Object.entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>Object.entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>o : { a: number; b: number; }
var entries1 = Object.entries(1);
var values = Object.values(o); // number[]
>values : number[]
>Object.values(o) : number[]
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>o : { a: number; b: number; }
var entries1 = Object.entries(1); // [string, any][]
>entries1 : [string, any][]
>Object.entries(1) : [string, any][]
>Object.entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>Object.entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>1 : 1
var entries2 = Object.entries({a: true, b: 2})
>entries2 : [string, number | boolean][]
>Object.entries({a: true, b: 2}) : [string, number | boolean][]
>Object.entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
var values1 = Object.values(1); // any[]
>values1 : any[]
>Object.values(1) : any[]
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>{a: true, b: 2} : { a: boolean; b: number; }
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>1 : 1
var entries2 = Object.entries({ a: true, b: 2 }); // [string, number|boolean][]
>entries2 : [string, number | boolean][]
>Object.entries({ a: true, b: 2 }) : [string, number | boolean][]
>Object.entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>{ a: true, b: 2 } : { a: boolean; b: number; }
>a : boolean
>true : true
>b : number
>2 : 2
var entries3 = Object.entries({})
var values2 = Object.values({ a: true, b: 2 }); // (number|boolean)[]
>values2 : (number | boolean)[]
>Object.values({ a: true, b: 2 }) : (number | boolean)[]
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>{ a: true, b: 2 } : { a: boolean; b: number; }
>a : boolean
>true : true
>b : number
>2 : 2
var entries3 = Object.entries({}); // [string, {}][]
>entries3 : [string, {}][]
>Object.entries({}) : [string, {}][]
>Object.entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>Object.entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>{} : {}
var values3 = Object.values({}); // {}[]
>values3 : {}[]
>Object.values({}) : {}[]
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>{} : {}
var a = ["a", "b", "c"];
>a : string[]
>["a", "b", "c"] : string[]
>"a" : "a"
>"b" : "b"
>"c" : "c"
var entries4 = Object.entries(a); // [string, string][]
>entries4 : [string, string][]
>Object.entries(a) : [string, string][]
>Object.entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>a : string[]
var values4 = Object.values(a); // string[]
>values4 : string[]
>Object.values(a) : string[]
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>a : string[]
enum E { A, B }
>E : E
>A : E.A
>B : E.B
var entries5 = Object.entries(E); // [string, any][]
>entries5 : [string, any][]
>Object.entries(E) : [string, any][]
>Object.entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>E : typeof E
var values5 = Object.values(E); // any[]
>values5 : any[]
>Object.values(E) : any[]
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>E : typeof E
interface I { }
>I : I
var i: I = {};
>i : I
>I : I
>{} : {}
var entries6 = Object.entries(i); // [string, any][]
>entries6 : [string, any][]
>Object.entries(i) : [string, any][]
>Object.entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>i : I
var values6 = Object.values(i); // any[]
>values6 : any[]
>Object.values(i) : any[]
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>i : I

View file

@ -10,9 +10,9 @@ var o = { a: 1, b: 2 };
for (var x of Object.values(o)) {
>x : number
>Object.values(o) : number[]
>Object.values : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): T[]; (o: {}): any[]; }
>Object.values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>Object : ObjectConstructor
>values : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): T[]; (o: {}): any[]; }
>values : { <T>(o: { [s: string]: T; } | ArrayLike<T>): T[]; (o: {}): any[]; }
>o : { a: number; b: number; }
let y = x;
@ -23,8 +23,8 @@ for (var x of Object.values(o)) {
var entries = Object.entries(o);
>entries : [string, number][]
>Object.entries(o) : [string, number][]
>Object.entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>Object.entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>Object : ObjectConstructor
>entries : { <T>(o: { [s: string]: T; } | { [n: number]: T; }): [string, T][]; (o: {}): [string, any][]; }
>entries : { <T>(o: { [s: string]: T; } | ArrayLike<T>): [string, T][]; (o: {}): [string, any][]; }
>o : { a: number; b: number; }

View file

@ -7,7 +7,27 @@ for (var x of Object.values(o)) {
let y = x;
}
var entries = Object.entries(o);
var entries1 = Object.entries(1);
var entries2 = Object.entries({a: true, b: 2})
var entries3 = Object.entries({})
var entries = Object.entries(o); // [string, number][]
var values = Object.values(o); // number[]
var entries1 = Object.entries(1); // [string, any][]
var values1 = Object.values(1); // any[]
var entries2 = Object.entries({ a: true, b: 2 }); // [string, number|boolean][]
var values2 = Object.values({ a: true, b: 2 }); // (number|boolean)[]
var entries3 = Object.entries({}); // [string, {}][]
var values3 = Object.values({}); // {}[]
var a = ["a", "b", "c"];
var entries4 = Object.entries(a); // [string, string][]
var values4 = Object.values(a); // string[]
enum E { A, B }
var entries5 = Object.entries(E); // [string, any][]
var values5 = Object.values(E); // any[]
interface I { }
var i: I = {};
var entries6 = Object.entries(i); // [string, any][]
var values6 = Object.values(i); // any[]