Skip to content

Commit 28f29ea

Browse files
committed
Revert NaN and Infinity to number types when not used in type positions
1 parent e08d755 commit 28f29ea

17 files changed

+128
-163
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16575,9 +16575,9 @@ namespace ts {
1657516575
addToSymbolTable(globals, builtinGlobals, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0);
1657616576

1657716577
getSymbolLinks(undefinedSymbol).type = undefinedType;
16578-
getSymbolLinks(NaNSymbol).type = NaNLiteralType;
16578+
getSymbolLinks(NaNSymbol).type = numberType;
1657916579
getSymbolLinks(NaNSymbol).declaredType = NaNLiteralType;
16580-
getSymbolLinks(InfinitySymbol).type = InfinityLiteralType;
16580+
getSymbolLinks(InfinitySymbol).type = numberType;
1658116581
getSymbolLinks(InfinitySymbol).declaredType = InfinityLiteralType;
1658216582
getSymbolLinks(argumentsSymbol).type = getGlobalType("IArguments");
1658316583
getSymbolLinks(unknownSymbol).type = unknownType;

tests/baselines/reference/InfinityLiteralTypes.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ function invertInfinity(x: number): number {
1616
let a: PositiveInfinityMember;
1717
let b: NegativeInfinityMember;
1818

19-
a = {member: Infinity};
20-
b = {member: -Infinity}
19+
a = {member: Infinity as Infinity};
20+
b = {member: -(<Infinity>Infinity)}
2121

2222
let c: -Infinity = invertInfinity(a.member);
2323
let d: Infinity = invertInfinity(b.member);
@@ -27,6 +27,12 @@ declare function stillNumber(x: number): boolean;
2727
stillNumber(c);
2828
stillNumber(d);
2929

30+
//Check that Infinity's declaration is still of type "number", while being "Infinity" when used as a type, so its usage is opt-in
31+
let y = Infinity;
32+
y = 42;
33+
let z = -Infinity;
34+
z = 42;
35+
3036
/*declare function isInfinity(x: number): x is (Infinity | -Infinity) {
3137
return x !== x;
3238
}
@@ -52,6 +58,11 @@ var d = invertInfinity(b.member);
5258
var x = c + d;
5359
stillNumber(c);
5460
stillNumber(d);
61+
//Check that Infinity's declaration is still of type "number", while being "Infinity" when used as a type, so its usage is opt-in
62+
var y = Infinity;
63+
y = 42;
64+
var z = -Infinity;
65+
z = 42;
5566
/*declare function isInfinity(x: number): x is (Infinity | -Infinity) {
5667
return x !== x;
5768
}

tests/baselines/reference/InfinityLiteralTypes.symbols

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,17 @@ let b: NegativeInfinityMember;
4040
>b : Symbol(b, Decl(InfinityLiteralTypes.ts, 15, 3))
4141
>NegativeInfinityMember : Symbol(NegativeInfinityMember, Decl(InfinityLiteralTypes.ts, 2, 1))
4242

43-
a = {member: Infinity};
43+
a = {member: Infinity as Infinity};
4444
>a : Symbol(a, Decl(InfinityLiteralTypes.ts, 14, 3))
4545
>member : Symbol(member, Decl(InfinityLiteralTypes.ts, 17, 5))
4646
>Infinity : Symbol(Infinity)
47+
>Infinity : Symbol(Infinity)
4748

48-
b = {member: -Infinity}
49+
b = {member: -(<Infinity>Infinity)}
4950
>b : Symbol(b, Decl(InfinityLiteralTypes.ts, 15, 3))
5051
>member : Symbol(member, Decl(InfinityLiteralTypes.ts, 18, 5))
5152
>Infinity : Symbol(Infinity)
53+
>Infinity : Symbol(Infinity)
5254

5355
let c: -Infinity = invertInfinity(a.member);
5456
>c : Symbol(c, Decl(InfinityLiteralTypes.ts, 20, 3))
@@ -82,6 +84,21 @@ stillNumber(d);
8284
>stillNumber : Symbol(stillNumber, Decl(InfinityLiteralTypes.ts, 23, 14))
8385
>d : Symbol(d, Decl(InfinityLiteralTypes.ts, 21, 3))
8486

87+
//Check that Infinity's declaration is still of type "number", while being "Infinity" when used as a type, so its usage is opt-in
88+
let y = Infinity;
89+
>y : Symbol(y, Decl(InfinityLiteralTypes.ts, 29, 3))
90+
>Infinity : Symbol(Infinity)
91+
92+
y = 42;
93+
>y : Symbol(y, Decl(InfinityLiteralTypes.ts, 29, 3))
94+
95+
let z = -Infinity;
96+
>z : Symbol(z, Decl(InfinityLiteralTypes.ts, 31, 3))
97+
>Infinity : Symbol(Infinity)
98+
99+
z = 42;
100+
>z : Symbol(z, Decl(InfinityLiteralTypes.ts, 31, 3))
101+
85102
/*declare function isInfinity(x: number): x is (Infinity | -Infinity) {
86103
return x !== x;
87104
}

tests/baselines/reference/InfinityLiteralTypes.types

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,25 @@ let b: NegativeInfinityMember;
4141
>b : NegativeInfinityMember
4242
>NegativeInfinityMember : NegativeInfinityMember
4343

44-
a = {member: Infinity};
45-
>a = {member: Infinity} : { member: Infinity; }
44+
a = {member: Infinity as Infinity};
45+
>a = {member: Infinity as Infinity} : { member: Infinity; }
4646
>a : PositiveInfinityMember
47-
>{member: Infinity} : { member: Infinity; }
47+
>{member: Infinity as Infinity} : { member: Infinity; }
4848
>member : Infinity
49+
>Infinity as Infinity : Infinity
50+
>Infinity : number
4951
>Infinity : Infinity
5052

51-
b = {member: -Infinity}
52-
>b = {member: -Infinity} : { member: -Infinity; }
53+
b = {member: -(<Infinity>Infinity)}
54+
>b = {member: -(<Infinity>Infinity)} : { member: -Infinity; }
5355
>b : NegativeInfinityMember
54-
>{member: -Infinity} : { member: -Infinity; }
56+
>{member: -(<Infinity>Infinity)} : { member: -Infinity; }
5557
>member : -Infinity
56-
>-Infinity : -Infinity
58+
>-(<Infinity>Infinity) : -Infinity
59+
>(<Infinity>Infinity) : Infinity
60+
><Infinity>Infinity : Infinity
5761
>Infinity : Infinity
62+
>Infinity : number
5863

5964
let c: -Infinity = invertInfinity(a.member);
6065
>c : -Infinity
@@ -93,6 +98,26 @@ stillNumber(d);
9398
>stillNumber : (x: number) => boolean
9499
>d : Infinity
95100

101+
//Check that Infinity's declaration is still of type "number", while being "Infinity" when used as a type, so its usage is opt-in
102+
let y = Infinity;
103+
>y : number
104+
>Infinity : number
105+
106+
y = 42;
107+
>y = 42 : number
108+
>y : number
109+
>42 : number
110+
111+
let z = -Infinity;
112+
>z : number
113+
>-Infinity : number
114+
>Infinity : number
115+
116+
z = 42;
117+
>z = 42 : number
118+
>z : number
119+
>42 : number
120+
96121
/*declare function isInfinity(x: number): x is (Infinity | -Infinity) {
97122
return x !== x;
98123
}

tests/baselines/reference/NaNLiteralTypes.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@ interface NaNMember {
44
}
55

66
let x: NaNMember;
7-
x = {member: NaN}
7+
x = {member: NaN as NaN}
88

99
declare function stillNumber(x: number): boolean;
1010
stillNumber(x.member);
1111

12+
//Check that NaN's declaration is still of type "number", while being "NaN" when used as a type, so its usage is opt-in
13+
let y = NaN;
14+
y = 42;
15+
1216
/*function isNaN(x: number): x is NaN {
1317
return x !== x;
1418
}
@@ -26,6 +30,9 @@ else {
2630
var x;
2731
x = { member: NaN };
2832
stillNumber(x.member);
33+
//Check that NaN's declaration is still of type "number", while being "NaN" when used as a type, so its usage is opt-in
34+
var y = NaN;
35+
y = 42;
2936
/*function isNaN(x: number): x is NaN {
3037
return x !== x;
3138
}

tests/baselines/reference/NaNLiteralTypes.symbols

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,30 @@ let x: NaNMember;
1111
>x : Symbol(x, Decl(NaNLiteralTypes.ts, 4, 3))
1212
>NaNMember : Symbol(NaNMember, Decl(NaNLiteralTypes.ts, 0, 0))
1313

14-
x = {member: NaN}
14+
x = {member: NaN as NaN}
1515
>x : Symbol(x, Decl(NaNLiteralTypes.ts, 4, 3))
1616
>member : Symbol(member, Decl(NaNLiteralTypes.ts, 5, 5))
1717
>NaN : Symbol(NaN)
18+
>NaN : Symbol(NaN)
1819

1920
declare function stillNumber(x: number): boolean;
20-
>stillNumber : Symbol(stillNumber, Decl(NaNLiteralTypes.ts, 5, 17))
21+
>stillNumber : Symbol(stillNumber, Decl(NaNLiteralTypes.ts, 5, 24))
2122
>x : Symbol(x, Decl(NaNLiteralTypes.ts, 7, 29))
2223

2324
stillNumber(x.member);
24-
>stillNumber : Symbol(stillNumber, Decl(NaNLiteralTypes.ts, 5, 17))
25+
>stillNumber : Symbol(stillNumber, Decl(NaNLiteralTypes.ts, 5, 24))
2526
>x.member : Symbol(NaNMember.member, Decl(NaNLiteralTypes.ts, 0, 21))
2627
>x : Symbol(x, Decl(NaNLiteralTypes.ts, 4, 3))
2728
>member : Symbol(NaNMember.member, Decl(NaNLiteralTypes.ts, 0, 21))
2829

30+
//Check that NaN's declaration is still of type "number", while being "NaN" when used as a type, so its usage is opt-in
31+
let y = NaN;
32+
>y : Symbol(y, Decl(NaNLiteralTypes.ts, 11, 3))
33+
>NaN : Symbol(NaN)
34+
35+
y = 42;
36+
>y : Symbol(y, Decl(NaNLiteralTypes.ts, 11, 3))
37+
2938
/*function isNaN(x: number): x is NaN {
3039
return x !== x;
3140
}

tests/baselines/reference/NaNLiteralTypes.types

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ let x: NaNMember;
1111
>x : NaNMember
1212
>NaNMember : NaNMember
1313

14-
x = {member: NaN}
15-
>x = {member: NaN} : { member: NaN; }
14+
x = {member: NaN as NaN}
15+
>x = {member: NaN as NaN} : { member: NaN; }
1616
>x : NaNMember
17-
>{member: NaN} : { member: NaN; }
17+
>{member: NaN as NaN} : { member: NaN; }
1818
>member : NaN
19+
>NaN as NaN : NaN
20+
>NaN : number
1921
>NaN : NaN
2022

2123
declare function stillNumber(x: number): boolean;
@@ -29,6 +31,16 @@ stillNumber(x.member);
2931
>x : NaNMember
3032
>member : NaN
3133

34+
//Check that NaN's declaration is still of type "number", while being "NaN" when used as a type, so its usage is opt-in
35+
let y = NaN;
36+
>y : number
37+
>NaN : number
38+
39+
y = 42;
40+
>y = 42 : number
41+
>y : number
42+
>42 : number
43+
3244
/*function isNaN(x: number): x is NaN {
3345
return x !== x;
3446
}

tests/baselines/reference/moduleAugmentationCollidingNamesInAugmentation1.symbols

Lines changed: 0 additions & 57 deletions
This file was deleted.

tests/baselines/reference/moduleAugmentationCollidingNamesInAugmentation1.types

Lines changed: 0 additions & 69 deletions
This file was deleted.

tests/baselines/reference/moduleScoping.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ var t3 = file3.v3;
4444
>v3 : boolean
4545

4646
var v4 = {a: true, b: NaN}; // Should shadow global v2 in this module
47-
>v4 : { a: boolean; b: NaN; }
48-
>{a: true, b: NaN} : { a: boolean; b: NaN; }
47+
>v4 : { a: boolean; b: number; }
48+
>{a: true, b: NaN} : { a: boolean; b: number; }
4949
>a : boolean
5050
>true : boolean
51-
>b : NaN
52-
>NaN : NaN
51+
>b : number
52+
>NaN : number
5353

5454
=== tests/cases/conformance/externalModules/file5.ts ===
5555
var x = v2; // Should be global v2 of type number again

0 commit comments

Comments
 (0)