Skip to content

Commit ab60d31

Browse files
committed
Fix #13932: Change the order of overloads and allow union for Object.create
1 parent a7728f8 commit ab60d31

12 files changed

+516
-6
lines changed

src/lib/es5.d.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,16 +137,16 @@ 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
140+
* Creates an object that has the specified prototype.
141+
* @param o Object to use as a prototype.
142142
*/
143-
create(o: null): any;
143+
create<T extends object>(o: T): T;
144144

145145
/**
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
146+
* Creates an object that has the specified prototype or that has null prototype.
147+
* @param o Object to use as a prototype. May be null.
148148
*/
149-
create<T extends object>(o: T): T;
149+
create<T extends object>(o: T | null): T | object;
150150

151151
/**
152152
* Creates an object that has the specified prototype, and that optionally contains specified properties.
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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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, --, --), 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): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
13+
>Object : ObjectConstructor
14+
>create : { <T extends object>(o: T): T; <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 : { a: number; b: string; }
19+
>Object.create({ a: 1, b: "" }) : { a: number; b: string; }
20+
>Object.create : { <T extends object>(o: T): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
21+
>Object : ObjectConstructor
22+
>create : { <T extends object>(o: T): T; <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): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
33+
>Object : ObjectConstructor
34+
>create : { <T extends object>(o: T): T; <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 : {}
39+
>Object.create({}) : {}
40+
>Object.create : { <T extends object>(o: T): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
41+
>Object : ObjectConstructor
42+
>create : { <T extends object>(o: T): T; <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): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
49+
>Object : ObjectConstructor
50+
>create : { <T extends object>(o: T): T; <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): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
58+
>Object : ObjectConstructor
59+
>create : { <T extends object>(o: T): T; <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): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
67+
>Object : ObjectConstructor
68+
>create : { <T extends object>(o: T): T; <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): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
80+
>Object : ObjectConstructor
81+
>create : { <T extends object>(o: T): T; <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): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
89+
>Object : ObjectConstructor
90+
>create : { <T extends object>(o: T): T; <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): T; <T extends object>(o: T | null): object | T; (o: object | null, properties: PropertyDescriptorMap): any; }
98+
>Object : ObjectConstructor
99+
>create : { <T extends object>(o: T): T; <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)