Skip to content

Commit cfb52e0

Browse files
committed
Test spread in unions of null/undefined
1 parent 93465bd commit cfb52e0

File tree

9 files changed

+144
-67
lines changed

9 files changed

+144
-67
lines changed

tests/baselines/reference/spreadUnion.symbols

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
=== tests/cases/compiler/spreadUnion.ts ===
1+
=== tests/cases/conformance/types/spread/spreadUnion.ts ===
22
var union: { a: number } | { b: string };
33
>union : Symbol(union, Decl(spreadUnion.ts, 0, 3))
44
>a : Symbol(a, Decl(spreadUnion.ts, 0, 12))

tests/baselines/reference/spreadUnion.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
=== tests/cases/compiler/spreadUnion.ts ===
1+
=== tests/cases/conformance/types/spread/spreadUnion.ts ===
22
var union: { a: number } | { b: string };
33
>union : { a: number; } | { b: string; }
44
>a : number

tests/baselines/reference/spreadUnion2.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@ declare const undefinedUnion: { a: number } | undefined;
33
declare const nullUnion: { b: number } | null;
44
declare const nullAndUndefinedUnion: null | undefined;
55

6-
var o1: { a: number };
6+
var o1: {} | { a: number };
77
var o1 = { ...undefinedUnion };
88

9-
var o2: { b: number };
9+
var o2: {} | { b: number };
1010
var o2 = { ...nullUnion };
1111

12-
var o3: { a: number, b: number };
12+
var o3: {} | { b: number } | { a: number } | { a: number, b: number };
1313
var o3 = { ...undefinedUnion, ...nullUnion };
1414
var o3 = { ...nullUnion, ...undefinedUnion };
1515

16-
var o4: { a: number };
16+
var o4: {} | { a: number };
1717
var o4 = { ...undefinedUnion, ...undefinedUnion };
1818

19-
var o5: { b: number };
19+
var o5: {} | { b: number };
2020
var o5 = { ...nullUnion, ...nullUnion };
2121

22-
var o6: { };
2322
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
24-
var o6 = { ...nullAndUndefinedUnion };
23+
var o7 = { ...nullAndUndefinedUnion };
24+
2525

2626
//// [spreadUnion2.js]
2727
var __assign = (this && this.__assign) || Object.assign || function(t) {
@@ -43,6 +43,5 @@ var o4;
4343
var o4 = __assign({}, undefinedUnion, undefinedUnion);
4444
var o5;
4545
var o5 = __assign({}, nullUnion, nullUnion);
46-
var o6;
4746
var o6 = __assign({}, nullAndUndefinedUnion, nullAndUndefinedUnion);
48-
var o6 = __assign({}, nullAndUndefinedUnion);
47+
var o7 = __assign({}, nullAndUndefinedUnion);
Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
=== tests/cases/compiler/spreadUnion2.ts ===
1+
=== tests/cases/conformance/types/spread/spreadUnion2.ts ===
22
declare const undefinedUnion: { a: number } | undefined;
33
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
44
>a : Symbol(a, Decl(spreadUnion2.ts, 0, 31))
@@ -10,26 +10,28 @@ declare const nullUnion: { b: number } | null;
1010
declare const nullAndUndefinedUnion: null | undefined;
1111
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))
1212

13-
var o1: { a: number };
13+
var o1: {} | { a: number };
1414
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 4, 3), Decl(spreadUnion2.ts, 5, 3))
15-
>a : Symbol(a, Decl(spreadUnion2.ts, 4, 9))
15+
>a : Symbol(a, Decl(spreadUnion2.ts, 4, 14))
1616

1717
var o1 = { ...undefinedUnion };
1818
>o1 : Symbol(o1, Decl(spreadUnion2.ts, 4, 3), Decl(spreadUnion2.ts, 5, 3))
1919
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
2020

21-
var o2: { b: number };
21+
var o2: {} | { b: number };
2222
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 7, 3), Decl(spreadUnion2.ts, 8, 3))
23-
>b : Symbol(b, Decl(spreadUnion2.ts, 7, 9))
23+
>b : Symbol(b, Decl(spreadUnion2.ts, 7, 14))
2424

2525
var o2 = { ...nullUnion };
2626
>o2 : Symbol(o2, Decl(spreadUnion2.ts, 7, 3), Decl(spreadUnion2.ts, 8, 3))
2727
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
2828

29-
var o3: { a: number, b: number };
29+
var o3: {} | { b: number } | { a: number } | { a: number, b: number };
3030
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3), Decl(spreadUnion2.ts, 12, 3))
31-
>a : Symbol(a, Decl(spreadUnion2.ts, 10, 9))
32-
>b : Symbol(b, Decl(spreadUnion2.ts, 10, 20))
31+
>b : Symbol(b, Decl(spreadUnion2.ts, 10, 14))
32+
>a : Symbol(a, Decl(spreadUnion2.ts, 10, 30))
33+
>a : Symbol(a, Decl(spreadUnion2.ts, 10, 46))
34+
>b : Symbol(b, Decl(spreadUnion2.ts, 10, 57))
3335

3436
var o3 = { ...undefinedUnion, ...nullUnion };
3537
>o3 : Symbol(o3, Decl(spreadUnion2.ts, 10, 3), Decl(spreadUnion2.ts, 11, 3), Decl(spreadUnion2.ts, 12, 3))
@@ -41,33 +43,30 @@ var o3 = { ...nullUnion, ...undefinedUnion };
4143
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
4244
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
4345

44-
var o4: { a: number };
46+
var o4: {} | { a: number };
4547
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 14, 3), Decl(spreadUnion2.ts, 15, 3))
46-
>a : Symbol(a, Decl(spreadUnion2.ts, 14, 9))
48+
>a : Symbol(a, Decl(spreadUnion2.ts, 14, 14))
4749

4850
var o4 = { ...undefinedUnion, ...undefinedUnion };
4951
>o4 : Symbol(o4, Decl(spreadUnion2.ts, 14, 3), Decl(spreadUnion2.ts, 15, 3))
5052
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
5153
>undefinedUnion : Symbol(undefinedUnion, Decl(spreadUnion2.ts, 0, 13))
5254

53-
var o5: { b: number };
55+
var o5: {} | { b: number };
5456
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 17, 3), Decl(spreadUnion2.ts, 18, 3))
55-
>b : Symbol(b, Decl(spreadUnion2.ts, 17, 9))
57+
>b : Symbol(b, Decl(spreadUnion2.ts, 17, 14))
5658

5759
var o5 = { ...nullUnion, ...nullUnion };
5860
>o5 : Symbol(o5, Decl(spreadUnion2.ts, 17, 3), Decl(spreadUnion2.ts, 18, 3))
5961
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
6062
>nullUnion : Symbol(nullUnion, Decl(spreadUnion2.ts, 1, 13))
6163

62-
var o6: { };
63-
>o6 : Symbol(o6, Decl(spreadUnion2.ts, 20, 3), Decl(spreadUnion2.ts, 21, 3), Decl(spreadUnion2.ts, 22, 3))
64-
6564
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
66-
>o6 : Symbol(o6, Decl(spreadUnion2.ts, 20, 3), Decl(spreadUnion2.ts, 21, 3), Decl(spreadUnion2.ts, 22, 3))
65+
>o6 : Symbol(o6, Decl(spreadUnion2.ts, 20, 3))
6766
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))
6867
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))
6968

70-
var o6 = { ...nullAndUndefinedUnion };
71-
>o6 : Symbol(o6, Decl(spreadUnion2.ts, 20, 3), Decl(spreadUnion2.ts, 21, 3), Decl(spreadUnion2.ts, 22, 3))
69+
var o7 = { ...nullAndUndefinedUnion };
70+
>o7 : Symbol(o7, Decl(spreadUnion2.ts, 21, 3))
7271
>nullAndUndefinedUnion : Symbol(nullAndUndefinedUnion, Decl(spreadUnion2.ts, 2, 13))
7372

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
=== tests/cases/compiler/spreadUnion2.ts ===
1+
=== tests/cases/conformance/types/spread/spreadUnion2.ts ===
22
declare const undefinedUnion: { a: number } | undefined;
33
>undefinedUnion : { a: number; } | undefined
44
>a : number
@@ -12,72 +12,71 @@ declare const nullAndUndefinedUnion: null | undefined;
1212
>nullAndUndefinedUnion : null | undefined
1313
>null : null
1414

15-
var o1: { a: number };
16-
>o1 : { a: number; }
15+
var o1: {} | { a: number };
16+
>o1 : {} | { a: number; }
1717
>a : number
1818

1919
var o1 = { ...undefinedUnion };
20-
>o1 : { a: number; }
21-
>{ ...undefinedUnion } : { a: number; }
20+
>o1 : {} | { a: number; }
21+
>{ ...undefinedUnion } : {} | { a: number; }
2222
>undefinedUnion : { a: number; } | undefined
2323

24-
var o2: { b: number };
25-
>o2 : { b: number; }
24+
var o2: {} | { b: number };
25+
>o2 : {} | { b: number; }
2626
>b : number
2727

2828
var o2 = { ...nullUnion };
29-
>o2 : { b: number; }
30-
>{ ...nullUnion } : { b: number; }
29+
>o2 : {} | { b: number; }
30+
>{ ...nullUnion } : {} | { b: number; }
3131
>nullUnion : { b: number; } | null
3232

33-
var o3: { a: number, b: number };
34-
>o3 : { a: number; b: number; }
33+
var o3: {} | { b: number } | { a: number } | { a: number, b: number };
34+
>o3 : {} | { b: number; } | { a: number; } | { a: number; b: number; }
35+
>b : number
36+
>a : number
3537
>a : number
3638
>b : number
3739

3840
var o3 = { ...undefinedUnion, ...nullUnion };
39-
>o3 : { a: number; b: number; }
40-
>{ ...undefinedUnion, ...nullUnion } : { b: number; a: number; }
41+
>o3 : {} | { b: number; } | { a: number; } | { a: number; b: number; }
42+
>{ ...undefinedUnion, ...nullUnion } : {} | { b: number; } | { a: number; } | { b: number; a: number; }
4143
>undefinedUnion : { a: number; } | undefined
4244
>nullUnion : { b: number; } | null
4345

4446
var o3 = { ...nullUnion, ...undefinedUnion };
45-
>o3 : { a: number; b: number; }
46-
>{ ...nullUnion, ...undefinedUnion } : { a: number; b: number; }
47+
>o3 : {} | { b: number; } | { a: number; } | { a: number; b: number; }
48+
>{ ...nullUnion, ...undefinedUnion } : {} | { a: number; } | { b: number; } | { a: number; b: number; }
4749
>nullUnion : { b: number; } | null
4850
>undefinedUnion : { a: number; } | undefined
4951

50-
var o4: { a: number };
51-
>o4 : { a: number; }
52+
var o4: {} | { a: number };
53+
>o4 : {} | { a: number; }
5254
>a : number
5355

5456
var o4 = { ...undefinedUnion, ...undefinedUnion };
55-
>o4 : { a: number; }
56-
>{ ...undefinedUnion, ...undefinedUnion } : { a: number; }
57+
>o4 : {} | { a: number; }
58+
>{ ...undefinedUnion, ...undefinedUnion } : {} | { a: number; } | { a: number; } | { a: number; }
5759
>undefinedUnion : { a: number; } | undefined
5860
>undefinedUnion : { a: number; } | undefined
5961

60-
var o5: { b: number };
61-
>o5 : { b: number; }
62+
var o5: {} | { b: number };
63+
>o5 : {} | { b: number; }
6264
>b : number
6365

6466
var o5 = { ...nullUnion, ...nullUnion };
65-
>o5 : { b: number; }
66-
>{ ...nullUnion, ...nullUnion } : { b: number; }
67+
>o5 : {} | { b: number; }
68+
>{ ...nullUnion, ...nullUnion } : {} | { b: number; } | { b: number; } | { b: number; }
6769
>nullUnion : { b: number; } | null
6870
>nullUnion : { b: number; } | null
6971

70-
var o6: { };
71-
>o6 : {}
72-
7372
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
74-
>o6 : {}
75-
>{ ...nullAndUndefinedUnion, ...nullAndUndefinedUnion } : {}
73+
>o6 : {} | {} | {} | {}
74+
>{ ...nullAndUndefinedUnion, ...nullAndUndefinedUnion } : {} | {} | {} | {}
7675
>nullAndUndefinedUnion : null | undefined
7776
>nullAndUndefinedUnion : null | undefined
7877

79-
var o6 = { ...nullAndUndefinedUnion };
80-
>o6 : {}
81-
>{ ...nullAndUndefinedUnion } : {}
78+
var o7 = { ...nullAndUndefinedUnion };
79+
>o7 : {} | {}
80+
>{ ...nullAndUndefinedUnion } : {} | {}
8281
>nullAndUndefinedUnion : null | undefined
8382

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
tests/cases/conformance/types/spread/spreadUnion3.ts(2,5): error TS2322: Type '{ y: number; } | { y: string; }' is not assignable to type '{ y: string; }'.
2+
Type '{ y: number; }' is not assignable to type '{ y: string; }'.
3+
Types of property 'y' are incompatible.
4+
Type 'number' is not assignable to type 'string'.
5+
tests/cases/conformance/types/spread/spreadUnion3.ts(9,23): error TS2339: Property 'a' does not exist on type '{} | {} | { a: number; }'.
6+
Property 'a' does not exist on type '{}'.
7+
8+
9+
==== tests/cases/conformance/types/spread/spreadUnion3.ts (2 errors) ====
10+
function f(x: { y: string } | undefined): { y: string } {
11+
return { y: 123, ...x } // y: string | number
12+
~~~~~~~~~~~~~~~~~~~~~~~
13+
!!! error TS2322: Type '{ y: number; } | { y: string; }' is not assignable to type '{ y: string; }'.
14+
!!! error TS2322: Type '{ y: number; }' is not assignable to type '{ y: string; }'.
15+
!!! error TS2322: Types of property 'y' are incompatible.
16+
!!! error TS2322: Type 'number' is not assignable to type 'string'.
17+
}
18+
f(undefined)
19+
20+
21+
function g(t?: { a: number } | null): void {
22+
let b = { ...t };
23+
let c: number = b.a; // might not have 'a'
24+
~
25+
!!! error TS2339: Property 'a' does not exist on type '{} | {} | { a: number; }'.
26+
!!! error TS2339: Property 'a' does not exist on type '{}'.
27+
}
28+
g()
29+
g(undefined)
30+
g(null)
31+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//// [spreadUnion3.ts]
2+
function f(x: { y: string } | undefined): { y: string } {
3+
return { y: 123, ...x } // y: string | number
4+
}
5+
f(undefined)
6+
7+
8+
function g(t?: { a: number } | null): void {
9+
let b = { ...t };
10+
let c: number = b.a; // might not have 'a'
11+
}
12+
g()
13+
g(undefined)
14+
g(null)
15+
16+
17+
//// [spreadUnion3.js]
18+
var __assign = (this && this.__assign) || Object.assign || function(t) {
19+
for (var s, i = 1, n = arguments.length; i < n; i++) {
20+
s = arguments[i];
21+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22+
t[p] = s[p];
23+
}
24+
return t;
25+
};
26+
function f(x) {
27+
return __assign({ y: 123 }, x); // y: string | number
28+
}
29+
f(undefined);
30+
function g(t) {
31+
var b = __assign({}, t);
32+
var c = b.a; // might not have 'a'
33+
}
34+
g();
35+
g(undefined);
36+
g(null);

tests/cases/conformance/types/spread/spreadUnion2.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,21 @@ declare const undefinedUnion: { a: number } | undefined;
44
declare const nullUnion: { b: number } | null;
55
declare const nullAndUndefinedUnion: null | undefined;
66

7-
var o1: { a: number };
7+
var o1: {} | { a: number };
88
var o1 = { ...undefinedUnion };
99

10-
var o2: { b: number };
10+
var o2: {} | { b: number };
1111
var o2 = { ...nullUnion };
1212

13-
var o3: { a: number, b: number };
13+
var o3: {} | { b: number } | { a: number } | { a: number, b: number };
1414
var o3 = { ...undefinedUnion, ...nullUnion };
1515
var o3 = { ...nullUnion, ...undefinedUnion };
1616

17-
var o4: { a: number };
17+
var o4: {} | { a: number };
1818
var o4 = { ...undefinedUnion, ...undefinedUnion };
1919

20-
var o5: { b: number };
20+
var o5: {} | { b: number };
2121
var o5 = { ...nullUnion, ...nullUnion };
2222

23-
var o6: { };
2423
var o6 = { ...nullAndUndefinedUnion, ...nullAndUndefinedUnion };
25-
var o6 = { ...nullAndUndefinedUnion };
24+
var o7 = { ...nullAndUndefinedUnion };
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @strictNullChecks: true
2+
function f(x: { y: string } | undefined): { y: string } {
3+
return { y: 123, ...x } // y: string | number
4+
}
5+
f(undefined)
6+
7+
8+
function g(t?: { a: number } | null): void {
9+
let b = { ...t };
10+
let c: number = b.a; // might not have 'a'
11+
}
12+
g()
13+
g(undefined)
14+
g(null)

0 commit comments

Comments
 (0)