Skip to content

Commit ae02db4

Browse files
authored
Merge pull request #13936 from Microsoft/FixObjectCreate
Fix #13932: Change the order of overloads and allow union for `Object.create`
2 parents 81f4e38 + 6feafc9 commit ae02db4

13 files changed

+523
-19
lines changed

src/lib/es5.d.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -137,16 +137,10 @@ interface ObjectConstructor {
137137
getOwnPropertyNames(o: any): string[];
138138

139139
/**
140-
* Creates an object that has null prototype.
141-
* @param o Object to use as a prototype. May be null
142-
*/
143-
create(o: null): any;
144-
145-
/**
146-
* Creates an object that has the specified prototype, and that optionally contains specified properties.
147-
* @param o Object to use as a prototype. May be null
140+
* Creates an object that has the specified prototype or that has null prototype.
141+
* @param o Object to use as a prototype. May be null.
148142
*/
149-
create<T extends object>(o: T): T;
143+
create<T extends object>(o: T | null): T | object;
150144

151145
/**
152146
* Creates an object that has the specified prototype, and that optionally contains specified properties.

tests/baselines/reference/assigningFromObjectToAnythingElse.errors.txt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
tests/cases/compiler/assigningFromObjectToAnythingElse.ts(3,1): error TS2322: Type 'Object' is not assignable to type 'RegExp'.
22
The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead?
33
Property 'exec' is missing in type 'Object'.
4-
tests/cases/compiler/assigningFromObjectToAnythingElse.ts(5,5): error TS2322: Type 'Object' is not assignable to type 'String'.
5-
The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead?
6-
Property 'charAt' is missing in type 'Object'.
7-
tests/cases/compiler/assigningFromObjectToAnythingElse.ts(6,5): error TS2322: Type 'Number' is not assignable to type 'String'.
8-
Property 'charAt' is missing in type 'Number'.
4+
tests/cases/compiler/assigningFromObjectToAnythingElse.ts(5,5): error TS2322: Type 'object | Object' is not assignable to type 'String'.
5+
Type 'object' is not assignable to type 'String'.
6+
Property 'charAt' is missing in type '{}'.
7+
tests/cases/compiler/assigningFromObjectToAnythingElse.ts(6,5): error TS2322: Type 'object | Number' is not assignable to type 'String'.
8+
Type 'object' is not assignable to type 'String'.
99
tests/cases/compiler/assigningFromObjectToAnythingElse.ts(8,5): error TS2322: Type 'Object' is not assignable to type 'Error'.
1010
The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead?
1111
Property 'name' is missing in type 'Object'.
@@ -22,13 +22,13 @@ tests/cases/compiler/assigningFromObjectToAnythingElse.ts(8,5): error TS2322: Ty
2222

2323
var a: String = Object.create<Object>("");
2424
~
25-
!!! error TS2322: Type 'Object' is not assignable to type 'String'.
26-
!!! error TS2322: The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead?
27-
!!! error TS2322: Property 'charAt' is missing in type 'Object'.
25+
!!! error TS2322: Type 'object | Object' is not assignable to type 'String'.
26+
!!! error TS2322: Type 'object' is not assignable to type 'String'.
27+
!!! error TS2322: Property 'charAt' is missing in type '{}'.
2828
var c: String = Object.create<Number>(1);
2929
~
30-
!!! error TS2322: Type 'Number' is not assignable to type 'String'.
31-
!!! error TS2322: Property 'charAt' is missing in type 'Number'.
30+
!!! error TS2322: Type 'object | Number' is not assignable to type 'String'.
31+
!!! error TS2322: Type 'object' is not assignable to type 'String'.
3232

3333
var w: Error = new Object();
3434
~
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
tests/cases/compiler/objectCreate-errors.ts(2,24): error TS2345: Argument of type '1' is not assignable to parameter of type 'object | null'.
2+
tests/cases/compiler/objectCreate-errors.ts(3,24): error TS2345: Argument of type '"string"' is not assignable to parameter of type 'object | null'.
3+
tests/cases/compiler/objectCreate-errors.ts(4,24): error TS2345: Argument of type 'false' is not assignable to parameter of type 'object | null'.
4+
tests/cases/compiler/objectCreate-errors.ts(5,24): error TS2345: Argument of type 'undefined' is not assignable to parameter of type 'object | null'.
5+
tests/cases/compiler/objectCreate-errors.ts(8,24): error TS2345: Argument of type '1' is not assignable to parameter of type 'object | null'.
6+
tests/cases/compiler/objectCreate-errors.ts(9,24): error TS2345: Argument of type '"string"' is not assignable to parameter of type 'object | null'.
7+
tests/cases/compiler/objectCreate-errors.ts(10,24): error TS2345: Argument of type 'false' is not assignable to parameter of type 'object | null'.
8+
tests/cases/compiler/objectCreate-errors.ts(11,24): error TS2345: Argument of type 'undefined' is not assignable to parameter of type 'object | null'.
9+
10+
11+
==== tests/cases/compiler/objectCreate-errors.ts (8 errors) ====
12+
13+
var e1 = Object.create(1); // Error
14+
~
15+
!!! error TS2345: Argument of type '1' is not assignable to parameter of type 'object | null'.
16+
var e2 = Object.create("string"); // Error
17+
~~~~~~~~
18+
!!! error TS2345: Argument of type '"string"' is not assignable to parameter of type 'object | null'.
19+
var e3 = Object.create(false); // Error
20+
~~~~~
21+
!!! error TS2345: Argument of type 'false' is not assignable to parameter of type 'object | null'.
22+
var e4 = Object.create(undefined); // Error
23+
~~~~~~~~~
24+
!!! error TS2345: Argument of type 'undefined' is not assignable to parameter of type 'object | null'.
25+
26+
27+
var e5 = Object.create(1, {}); // Error
28+
~
29+
!!! error TS2345: Argument of type '1' is not assignable to parameter of type 'object | null'.
30+
var e6 = Object.create("string", {}); // Error
31+
~~~~~~~~
32+
!!! error TS2345: Argument of type '"string"' is not assignable to parameter of type 'object | null'.
33+
var e7 = Object.create(false, {}); // Error
34+
~~~~~
35+
!!! error TS2345: Argument of type 'false' is not assignable to parameter of type 'object | null'.
36+
var e8 = Object.create(undefined, {}); // Error
37+
~~~~~~~~~
38+
!!! error TS2345: Argument of type 'undefined' is not assignable to parameter of type 'object | null'.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//// [objectCreate-errors.ts]
2+
3+
var e1 = Object.create(1); // Error
4+
var e2 = Object.create("string"); // Error
5+
var e3 = Object.create(false); // Error
6+
var e4 = Object.create(undefined); // Error
7+
8+
9+
var e5 = Object.create(1, {}); // Error
10+
var e6 = Object.create("string", {}); // Error
11+
var e7 = Object.create(false, {}); // Error
12+
var e8 = Object.create(undefined, {}); // Error
13+
14+
//// [objectCreate-errors.js]
15+
var e1 = Object.create(1); // Error
16+
var e2 = Object.create("string"); // Error
17+
var e3 = Object.create(false); // Error
18+
var e4 = Object.create(undefined); // Error
19+
var e5 = Object.create(1, {}); // Error
20+
var e6 = Object.create("string", {}); // Error
21+
var e7 = Object.create(false, {}); // Error
22+
var e8 = Object.create(undefined, {}); // Error
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//// [objectCreate.ts]
2+
3+
declare var union: null | { a: number, b: string };
4+
5+
var n = Object.create(null); // object
6+
var t = Object.create({ a: 1, b: "" }); // {a: number, b: string }
7+
var u = Object.create(union); // object | {a: number, b: string }
8+
var e = Object.create({}); // {}
9+
var o = Object.create(<object>{}); // object
10+
11+
var a = Object.create(null, {}); // any
12+
var a = Object.create({ a: 1, b: "" }, {});
13+
var a = Object.create(union, {});
14+
var a = Object.create({}, {});
15+
var a = Object.create(<object>{}, {});
16+
17+
18+
//// [objectCreate.js]
19+
var n = Object.create(null); // object
20+
var t = Object.create({ a: 1, b: "" }); // {a: number, b: string }
21+
var u = Object.create(union); // object | {a: number, b: string }
22+
var e = Object.create({}); // {}
23+
var o = Object.create({}); // object
24+
var a = Object.create(null, {}); // any
25+
var a = Object.create({ a: 1, b: "" }, {});
26+
var a = Object.create(union, {});
27+
var a = Object.create({}, {});
28+
var a = Object.create({}, {});
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
=== tests/cases/compiler/objectCreate.ts ===
2+
3+
declare var union: null | { a: number, b: string };
4+
>union : Symbol(union, Decl(objectCreate.ts, 1, 11))
5+
>a : Symbol(a, Decl(objectCreate.ts, 1, 27))
6+
>b : Symbol(b, Decl(objectCreate.ts, 1, 38))
7+
8+
var n = Object.create(null); // object
9+
>n : Symbol(n, Decl(objectCreate.ts, 3, 3))
10+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
11+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
12+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
13+
14+
var t = Object.create({ a: 1, b: "" }); // {a: number, b: string }
15+
>t : Symbol(t, Decl(objectCreate.ts, 4, 3))
16+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
17+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
18+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
19+
>a : Symbol(a, Decl(objectCreate.ts, 4, 23))
20+
>b : Symbol(b, Decl(objectCreate.ts, 4, 29))
21+
22+
var u = Object.create(union); // object | {a: number, b: string }
23+
>u : Symbol(u, Decl(objectCreate.ts, 5, 3))
24+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
25+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
26+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
27+
>union : Symbol(union, Decl(objectCreate.ts, 1, 11))
28+
29+
var e = Object.create({}); // {}
30+
>e : Symbol(e, Decl(objectCreate.ts, 6, 3))
31+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
32+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
33+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
34+
35+
var o = Object.create(<object>{}); // object
36+
>o : Symbol(o, Decl(objectCreate.ts, 7, 3))
37+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
38+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
39+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
40+
41+
var a = Object.create(null, {}); // any
42+
>a : Symbol(a, Decl(objectCreate.ts, 9, 3), Decl(objectCreate.ts, 10, 3), Decl(objectCreate.ts, 11, 3), Decl(objectCreate.ts, 12, 3), Decl(objectCreate.ts, 13, 3))
43+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
44+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
45+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
46+
47+
var a = Object.create({ a: 1, b: "" }, {});
48+
>a : Symbol(a, Decl(objectCreate.ts, 9, 3), Decl(objectCreate.ts, 10, 3), Decl(objectCreate.ts, 11, 3), Decl(objectCreate.ts, 12, 3), Decl(objectCreate.ts, 13, 3))
49+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
50+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
51+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
52+
>a : Symbol(a, Decl(objectCreate.ts, 10, 23))
53+
>b : Symbol(b, Decl(objectCreate.ts, 10, 29))
54+
55+
var a = Object.create(union, {});
56+
>a : Symbol(a, Decl(objectCreate.ts, 9, 3), Decl(objectCreate.ts, 10, 3), Decl(objectCreate.ts, 11, 3), Decl(objectCreate.ts, 12, 3), Decl(objectCreate.ts, 13, 3))
57+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
58+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
59+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
60+
>union : Symbol(union, Decl(objectCreate.ts, 1, 11))
61+
62+
var a = Object.create({}, {});
63+
>a : Symbol(a, Decl(objectCreate.ts, 9, 3), Decl(objectCreate.ts, 10, 3), Decl(objectCreate.ts, 11, 3), Decl(objectCreate.ts, 12, 3), Decl(objectCreate.ts, 13, 3))
64+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
65+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
66+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
67+
68+
var a = Object.create(<object>{}, {});
69+
>a : Symbol(a, Decl(objectCreate.ts, 9, 3), Decl(objectCreate.ts, 10, 3), Decl(objectCreate.ts, 11, 3), Decl(objectCreate.ts, 12, 3), Decl(objectCreate.ts, 13, 3))
70+
>Object.create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
71+
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
72+
>create : Symbol(ObjectConstructor.create, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
73+
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
=== tests/cases/compiler/objectCreate.ts ===
2+
3+
declare var union: null | { a: number, b: string };
4+
>union : { a: number; b: string; } | null
5+
>null : null
6+
>a : number
7+
>b : string
8+
9+
var n = Object.create(null); // object
10+
>n : object
11+
>Object.create(null) : object
12+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
13+
>Object : ObjectConstructor
14+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
15+
>null : null
16+
17+
var t = Object.create({ a: 1, b: "" }); // {a: number, b: string }
18+
>t : object | { a: number; b: string; }
19+
>Object.create({ a: 1, b: "" }) : object | { a: number; b: string; }
20+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
21+
>Object : ObjectConstructor
22+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
23+
>{ a: 1, b: "" } : { a: number; b: string; }
24+
>a : number
25+
>1 : 1
26+
>b : string
27+
>"" : ""
28+
29+
var u = Object.create(union); // object | {a: number, b: string }
30+
>u : object | { a: number; b: string; }
31+
>Object.create(union) : object | { a: number; b: string; }
32+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
33+
>Object : ObjectConstructor
34+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
35+
>union : { a: number; b: string; } | null
36+
37+
var e = Object.create({}); // {}
38+
>e : object | {}
39+
>Object.create({}) : object | {}
40+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
41+
>Object : ObjectConstructor
42+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
43+
>{} : {}
44+
45+
var o = Object.create(<object>{}); // object
46+
>o : object
47+
>Object.create(<object>{}) : object
48+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
49+
>Object : ObjectConstructor
50+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
51+
><object>{} : object
52+
>{} : {}
53+
54+
var a = Object.create(null, {}); // any
55+
>a : any
56+
>Object.create(null, {}) : any
57+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
58+
>Object : ObjectConstructor
59+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
60+
>null : null
61+
>{} : {}
62+
63+
var a = Object.create({ a: 1, b: "" }, {});
64+
>a : any
65+
>Object.create({ a: 1, b: "" }, {}) : any
66+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
67+
>Object : ObjectConstructor
68+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
69+
>{ a: 1, b: "" } : { a: number; b: string; }
70+
>a : number
71+
>1 : 1
72+
>b : string
73+
>"" : ""
74+
>{} : {}
75+
76+
var a = Object.create(union, {});
77+
>a : any
78+
>Object.create(union, {}) : any
79+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
80+
>Object : ObjectConstructor
81+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
82+
>union : { a: number; b: string; } | null
83+
>{} : {}
84+
85+
var a = Object.create({}, {});
86+
>a : any
87+
>Object.create({}, {}) : any
88+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
89+
>Object : ObjectConstructor
90+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
91+
>{} : {}
92+
>{} : {}
93+
94+
var a = Object.create(<object>{}, {});
95+
>a : any
96+
>Object.create(<object>{}, {}) : any
97+
>Object.create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
98+
>Object : ObjectConstructor
99+
>create : { <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
100+
><object>{} : object
101+
>{} : {}
102+
>{} : {}
103+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//// [objectCreate2.ts]
2+
3+
declare var union: null | { a: number, b: string };
4+
5+
var n = Object.create(null); // any
6+
var t = Object.create({ a: 1, b: "" }); // {a: number, b: string }
7+
var u = Object.create(union); // {a: number, b: string }
8+
var e = Object.create({}); // {}
9+
var o = Object.create(<object>{}); // object
10+
11+
var a = Object.create(null, {}); // any
12+
var a = Object.create({ a: 1, b: "" }, {});
13+
var a = Object.create(union, {});
14+
var a = Object.create({}, {});
15+
var a = Object.create(<object>{}, {});
16+
17+
18+
//// [objectCreate2.js]
19+
var n = Object.create(null); // any
20+
var t = Object.create({ a: 1, b: "" }); // {a: number, b: string }
21+
var u = Object.create(union); // {a: number, b: string }
22+
var e = Object.create({}); // {}
23+
var o = Object.create({}); // object
24+
var a = Object.create(null, {}); // any
25+
var a = Object.create({ a: 1, b: "" }, {});
26+
var a = Object.create(union, {});
27+
var a = Object.create({}, {});
28+
var a = Object.create({}, {});

0 commit comments

Comments
 (0)