Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 617f60e

Browse filesBrowse files
authored
Merge pull request microsoft#16306 from Microsoft/fix-nullable-filtering-in-spreads
Fix nullable filtering in spreads
2 parents 52e867c + cfb52e0 commit 617f60e
Copy full SHA for 617f60e

11 files changed

+144-69Lines changed: 144 additions & 69 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎src/compiler/checker.ts‎

Copy file name to clipboardExpand all lines: src/compiler/checker.ts
-2Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7642,11 +7642,9 @@ namespace ts {
76427642
if (left.flags & TypeFlags.Any || right.flags & TypeFlags.Any) {
76437643
return anyType;
76447644
}
7645-
left = filterType(left, t => !(t.flags & TypeFlags.Nullable));
76467645
if (left.flags & TypeFlags.Never) {
76477646
return right;
76487647
}
7649-
right = filterType(right, t => !(t.flags & TypeFlags.Nullable));
76507648
if (right.flags & TypeFlags.Never) {
76517649
return left;
76527650
}
Collapse file

‎tests/baselines/reference/spreadUnion.symbols‎

Copy file name to clipboardExpand all lines: tests/baselines/reference/spreadUnion.symbols
+1-1Lines 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))
Collapse file

‎tests/baselines/reference/spreadUnion.types‎

Copy file name to clipboardExpand all lines: tests/baselines/reference/spreadUnion.types
+1-1Lines 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
Collapse file

‎tests/baselines/reference/spreadUnion2.js‎

Copy file name to clipboardExpand all lines: tests/baselines/reference/spreadUnion2.js
+8-9Lines 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);
Collapse file
+17-18Lines 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

Collapse file
+30-31Lines 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

Collapse file
+31Lines 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+
Collapse file
+36Lines 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);
Collapse file
File renamed without changes.
Collapse file

‎tests/cases/compiler/spreadUnion2.ts‎ ‎…conformance/types/spread/spreadUnion2.ts‎tests/cases/compiler/spreadUnion2.ts renamed to tests/cases/conformance/types/spread/spreadUnion2.ts tests/cases/compiler/spreadUnion2.ts renamed to tests/cases/conformance/types/spread/spreadUnion2.ts

Copy file name to clipboardExpand all lines: tests/cases/conformance/types/spread/spreadUnion2.ts
+6-7Lines 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 };

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.