Skip to content

Commit 29105a6

Browse files
committed
Object.keys/entries: remove keyof & string intersections
Now that keyof T only returns string or string subtypes (microsoft#12425), there’s no need to do keyof T & string.
1 parent 944625a commit 29105a6

7 files changed

+50
-55
lines changed

src/lib/es2017.object.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ interface ObjectConstructor {
1010
* @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.
1111
*/
1212
entries<T>(o: Array<T>): [string, T][];
13-
entries<T extends { [key: string]: any }, K extends keyof T>(o: T): [keyof T & string, T[K]][];
13+
entries<T extends { [key: string]: any }, K extends keyof T>(o: T): [keyof T, T[K]][];
1414
entries(o: any): [string, any][];
1515
}

src/lib/es5.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ interface ObjectConstructor {
223223
* @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.
224224
*/
225225
keys<T>(o: Array<T>): string[];
226-
keys<T extends { [key: string]: any }>(o: T): (keyof T & string)[];
226+
keys<T extends { [key: string]: any }>(o: T): (keyof T)[];
227227
keys(o: any): string[];
228228
}
229229

tests/baselines/reference/useObjectValuesAndEntries1.js

+8-10
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ for (var x of Object.values(o)) {
66
let y = x;
77
}
88

9-
var entries = Object.entries(o); // <-- entries: [('a' & string) | ('b' & string), number][]
9+
var entries = Object.entries(o); // <-- entries: ['a' | 'b', number][]
1010
var entries1 = Object.entries(1); // <-- entries: [string, any][]
11-
var entries2 = Object.entries({a: true, b: 2}) // [('a' & string) | ('b' & string), number | boolean][]
12-
var entries3 = Object.entries({}) // [string, any][]
11+
var entries2 = Object.entries({a: true, b: 2}) // [('a' | 'b'), number | boolean][]
12+
var entries3 = Object.entries({}) // [never, any][]
1313
var entries4 = Object.entries([1, 2, 3, 4]); // [string, number][]
1414

15-
// type below should be [string | (string & number), any] NOT [string | number, any]
1615
var x2: { [index: string]: any } = {1: 2};
17-
var entries5 = Object.entries(x2);
16+
var entries5 = Object.entries(x2); // [string, any][]
1817

1918

2019
//// [useObjectValuesAndEntries1.js]
@@ -23,11 +22,10 @@ for (var _i = 0, _a = Object.values(o); _i < _a.length; _i++) {
2322
var x = _a[_i];
2423
var y = x;
2524
}
26-
var entries = Object.entries(o); // <-- entries: [('a' & string) | ('b' & string), number][]
25+
var entries = Object.entries(o); // <-- entries: ['a' | 'b', number][]
2726
var entries1 = Object.entries(1); // <-- entries: [string, any][]
28-
var entries2 = Object.entries({ a: true, b: 2 }); // [('a' & string) | ('b' & string), number | boolean][]
29-
var entries3 = Object.entries({}); // [string, any][]
27+
var entries2 = Object.entries({ a: true, b: 2 }); // [('a' | 'b'), number | boolean][]
28+
var entries3 = Object.entries({}); // [never, any][]
3029
var entries4 = Object.entries([1, 2, 3, 4]); // [string, number][]
31-
// type below should be [string | (string & number), any] NOT [string | number, any]
3230
var x2 = { 1: 2 };
33-
var entries5 = Object.entries(x2);
31+
var entries5 = Object.entries(x2); // [string, any][]

tests/baselines/reference/useObjectValuesAndEntries1.symbols

+8-9
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ for (var x of Object.values(o)) {
1717
>x : Symbol(x, Decl(useObjectValuesAndEntries1.ts, 3, 8))
1818
}
1919

20-
var entries = Object.entries(o); // <-- entries: [('a' & string) | ('b' & string), number][]
20+
var entries = Object.entries(o); // <-- entries: ['a' | 'b', number][]
2121
>entries : Symbol(entries, Decl(useObjectValuesAndEntries1.ts, 7, 3))
2222
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
2323
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
@@ -30,15 +30,15 @@ var entries1 = Object.entries(1); // <-- entries: [string, any][]
3030
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
3131
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
3232

33-
var entries2 = Object.entries({a: true, b: 2}) // [('a' & string) | ('b' & string), number | boolean][]
33+
var entries2 = Object.entries({a: true, b: 2}) // [('a' | 'b'), number | boolean][]
3434
>entries2 : Symbol(entries2, Decl(useObjectValuesAndEntries1.ts, 9, 3))
3535
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
3636
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
3737
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
3838
>a : Symbol(a, Decl(useObjectValuesAndEntries1.ts, 9, 31))
3939
>b : Symbol(b, Decl(useObjectValuesAndEntries1.ts, 9, 39))
4040

41-
var entries3 = Object.entries({}) // [string, any][]
41+
var entries3 = Object.entries({}) // [never, any][]
4242
>entries3 : Symbol(entries3, Decl(useObjectValuesAndEntries1.ts, 10, 3))
4343
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
4444
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
@@ -50,15 +50,14 @@ var entries4 = Object.entries([1, 2, 3, 4]); // [string, number][]
5050
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
5151
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
5252

53-
// type below should be [string | (string & number), any] NOT [string | number, any]
5453
var x2: { [index: string]: any } = {1: 2};
55-
>x2 : Symbol(x2, Decl(useObjectValuesAndEntries1.ts, 14, 3))
56-
>index : Symbol(index, Decl(useObjectValuesAndEntries1.ts, 14, 11))
54+
>x2 : Symbol(x2, Decl(useObjectValuesAndEntries1.ts, 13, 3))
55+
>index : Symbol(index, Decl(useObjectValuesAndEntries1.ts, 13, 11))
5756

58-
var entries5 = Object.entries(x2);
59-
>entries5 : Symbol(entries5, Decl(useObjectValuesAndEntries1.ts, 15, 3))
57+
var entries5 = Object.entries(x2); // [string, any][]
58+
>entries5 : Symbol(entries5, Decl(useObjectValuesAndEntries1.ts, 14, 3))
6059
>Object.entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
6160
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
6261
>entries : Symbol(ObjectConstructor.entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
63-
>x2 : Symbol(x2, Decl(useObjectValuesAndEntries1.ts, 14, 3))
62+
>x2 : Symbol(x2, Decl(useObjectValuesAndEntries1.ts, 13, 3))
6463

tests/baselines/reference/useObjectValuesAndEntries1.types

+24-25
Original file line numberDiff line numberDiff line change
@@ -21,66 +21,65 @@ for (var x of Object.values(o)) {
2121
>x : number
2222
}
2323

24-
var entries = Object.entries(o); // <-- entries: [('a' & string) | ('b' & string), number][]
25-
>entries : [("a" & string) | ("b" & string), number][]
26-
>Object.entries(o) : [("a" & string) | ("b" & string), number][]
27-
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
24+
var entries = Object.entries(o); // <-- entries: ['a' | 'b', number][]
25+
>entries : ["a" | "b", number][]
26+
>Object.entries(o) : ["a" | "b", number][]
27+
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
2828
>Object : ObjectConstructor
29-
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
29+
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
3030
>o : { a: number; b: number; }
3131

3232
var entries1 = Object.entries(1); // <-- entries: [string, any][]
3333
>entries1 : [string, any][]
3434
>Object.entries(1) : [string, any][]
35-
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
35+
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
3636
>Object : ObjectConstructor
37-
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
37+
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
3838
>1 : 1
3939

40-
var entries2 = Object.entries({a: true, b: 2}) // [('a' & string) | ('b' & string), number | boolean][]
41-
>entries2 : [("a" & string) | ("b" & string), number | boolean][]
42-
>Object.entries({a: true, b: 2}) : [("a" & string) | ("b" & string), number | boolean][]
43-
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
40+
var entries2 = Object.entries({a: true, b: 2}) // [('a' | 'b'), number | boolean][]
41+
>entries2 : ["a" | "b", number | boolean][]
42+
>Object.entries({a: true, b: 2}) : ["a" | "b", number | boolean][]
43+
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
4444
>Object : ObjectConstructor
45-
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
45+
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
4646
>{a: true, b: 2} : { a: true; b: number; }
4747
>a : boolean
4848
>true : true
4949
>b : number
5050
>2 : 2
5151

52-
var entries3 = Object.entries({}) // [string, any][]
53-
>entries3 : [string, any][]
54-
>Object.entries({}) : [string, any][]
55-
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
52+
var entries3 = Object.entries({}) // [never, any][]
53+
>entries3 : [never, any][]
54+
>Object.entries({}) : [never, any][]
55+
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
5656
>Object : ObjectConstructor
57-
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
57+
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
5858
>{} : {}
5959

6060
var entries4 = Object.entries([1, 2, 3, 4]); // [string, number][]
6161
>entries4 : [string, number][]
6262
>Object.entries([1, 2, 3, 4]) : [string, number][]
63-
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
63+
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
6464
>Object : ObjectConstructor
65-
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
65+
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
6666
>[1, 2, 3, 4] : number[]
6767
>1 : 1
6868
>2 : 2
6969
>3 : 3
7070
>4 : 4
7171

72-
// type below should be [string | (string & number), any] NOT [string | number, any]
7372
var x2: { [index: string]: any } = {1: 2};
7473
>x2 : { [index: string]: any; }
7574
>index : string
7675
>{1: 2} : { 1: number; }
7776
>2 : 2
7877

79-
var entries5 = Object.entries(x2);
80-
>entries5 : [string | (number & string), any][]
81-
>Object.entries(x2) : [string | (number & string), any][]
82-
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
78+
var entries5 = Object.entries(x2); // [string, any][]
79+
>entries5 : [string, any][]
80+
>Object.entries(x2) : [string, any][]
81+
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
8382
>Object : ObjectConstructor
84-
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
83+
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
8584
>x2 : { [index: string]: any; }
8685

tests/baselines/reference/useObjectValuesAndEntries4.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ for (var x of Object.values(o)) {
2222
}
2323

2424
var entries = Object.entries(o);
25-
>entries : [("a" & string) | ("b" & string), number][]
26-
>Object.entries(o) : [("a" & string) | ("b" & string), number][]
27-
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
25+
>entries : ["a" | "b", number][]
26+
>Object.entries(o) : ["a" | "b", number][]
27+
>Object.entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
2828
>Object : ObjectConstructor
29-
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T & string, T[K]][]; (o: any): [string, any][]; }
29+
>entries : { <T>(o: T[]): [string, T][]; <T extends { [key: string]: any; }, K extends keyof T>(o: T): [keyof T, T[K]][]; (o: any): [string, any][]; }
3030
>o : { a: number; b: number; }
3131

tests/cases/conformance/es2017/useObjectValuesAndEntries1.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@ for (var x of Object.values(o)) {
77
let y = x;
88
}
99

10-
var entries = Object.entries(o); // <-- entries: [('a' & string) | ('b' & string), number][]
10+
var entries = Object.entries(o); // <-- entries: ['a' | 'b', number][]
1111
var entries1 = Object.entries(1); // <-- entries: [string, any][]
12-
var entries2 = Object.entries({a: true, b: 2}) // [('a' & string) | ('b' & string), number | boolean][]
13-
var entries3 = Object.entries({}) // [string, any][]
12+
var entries2 = Object.entries({a: true, b: 2}) // [('a' | 'b'), number | boolean][]
13+
var entries3 = Object.entries({}) // [never, any][]
1414
var entries4 = Object.entries([1, 2, 3, 4]); // [string, number][]
1515

16-
// type below should be [string | (string & number), any] NOT [string | number, any]
1716
var x2: { [index: string]: any } = {1: 2};
18-
var entries5 = Object.entries(x2);
17+
var entries5 = Object.entries(x2); // [string, any][]

0 commit comments

Comments
 (0)