Skip to content

Commit 8b1acf6

Browse files
authored
Merge pull request #10577 from Microsoft/fixBooleanLiteralTypes
Fix boolean literal types
2 parents 766ecca + d5c0c05 commit 8b1acf6

File tree

98 files changed

+585
-444
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+585
-444
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2982,7 +2982,9 @@ namespace ts {
29822982
if (strictNullChecks && declaration.initializer && !(getFalsyFlags(checkExpressionCached(declaration.initializer)) & TypeFlags.Undefined)) {
29832983
type = getTypeWithFacts(type, TypeFacts.NEUndefined);
29842984
}
2985-
return type;
2985+
return declaration.initializer ?
2986+
getUnionType([type, checkExpressionCached(declaration.initializer)], /*subtypeReduction*/ true) :
2987+
type;
29862988
}
29872989

29882990
function getTypeForVariableLikeDeclarationFromJSDocComment(declaration: VariableLikeDeclaration) {
@@ -13532,7 +13534,7 @@ namespace ts {
1353213534
return maybeTypeOfKind(contextualType, (TypeFlags.NumberLiteral | TypeFlags.EnumLiteral));
1353313535
}
1353413536
if (type.flags & TypeFlags.Boolean) {
13535-
return maybeTypeOfKind(contextualType, TypeFlags.BooleanLiteral) && !isTypeAssignableTo(booleanType, contextualType);
13537+
return maybeTypeOfKind(contextualType, TypeFlags.BooleanLiteral);
1353613538
}
1353713539
if (type.flags & TypeFlags.Enum) {
1353813540
return typeContainsLiteralFromEnum(contextualType, <EnumType>type);

tests/baselines/reference/amdImportNotAsPrimaryExpression.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ var y: typeof foo.C1.s1 = false;
2828
>foo : typeof foo
2929
>C1 : typeof foo.C1
3030
>s1 : boolean
31-
>false : boolean
31+
>false : false
3232

3333
var z: foo.M1.I2;
3434
>z : f.I2

tests/baselines/reference/arrayBestCommonTypes.types

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -255,16 +255,16 @@ module EmptyTypes {
255255
>x : boolean
256256
>y : base
257257
>base : base
258-
>[{ x: true, y: new derived() }, { x: false, y: new base() }] : { x: boolean; y: derived; }[]
259-
>{ x: true, y: new derived() } : { x: boolean; y: derived; }
260-
>x : boolean
261-
>true : boolean
258+
>[{ x: true, y: new derived() }, { x: false, y: new base() }] : ({ x: true; y: derived; } | { x: false; y: base; })[]
259+
>{ x: true, y: new derived() } : { x: true; y: derived; }
260+
>x : true
261+
>true : true
262262
>y : derived
263263
>new derived() : derived
264264
>derived : typeof derived
265-
>{ x: false, y: new base() } : { x: boolean; y: base; }
266-
>x : boolean
267-
>false : boolean
265+
>{ x: false, y: new base() } : { x: false; y: base; }
266+
>x : false
267+
>false : false
268268
>y : base
269269
>new base() : base
270270
>base : typeof base
@@ -658,16 +658,16 @@ module NonEmptyTypes {
658658
>x : boolean
659659
>y : base
660660
>base : base
661-
>[{ x: true, y: new derived() }, { x: false, y: new base() }] : { x: boolean; y: base; }[]
662-
>{ x: true, y: new derived() } : { x: boolean; y: derived; }
663-
>x : boolean
664-
>true : boolean
661+
>[{ x: true, y: new derived() }, { x: false, y: new base() }] : ({ x: true; y: derived; } | { x: false; y: base; })[]
662+
>{ x: true, y: new derived() } : { x: true; y: derived; }
663+
>x : true
664+
>true : true
665665
>y : derived
666666
>new derived() : derived
667667
>derived : typeof derived
668-
>{ x: false, y: new base() } : { x: boolean; y: base; }
669-
>x : boolean
670-
>false : boolean
668+
>{ x: false, y: new base() } : { x: false; y: base; }
669+
>x : false
670+
>false : false
671671
>y : base
672672
>new base() : base
673673
>base : typeof base

tests/baselines/reference/assignmentTypeNarrowing.types

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ x; // string
1212
>x : string
1313

1414
[x] = [true];
15-
>[x] = [true] : [boolean]
15+
>[x] = [true] : [true]
1616
>[x] : [string | number | boolean | RegExp]
1717
>x : string | number | boolean | RegExp
18-
>[true] : [boolean]
19-
>true : boolean
18+
>[true] : [true]
19+
>true : true
2020

2121
x; // boolean
22-
>x : boolean
22+
>x : true
2323

2424
[x = ""] = [1];
2525
>[x = ""] = [1] : [number]
@@ -34,16 +34,16 @@ x; // string | number
3434
>x : string | number
3535

3636
({x} = {x: true});
37-
>({x} = {x: true}) : { x: boolean; }
38-
>{x} = {x: true} : { x: boolean; }
37+
>({x} = {x: true}) : { x: true; }
38+
>{x} = {x: true} : { x: true; }
3939
>{x} : { x: string | number | boolean | RegExp; }
4040
>x : string | number | boolean | RegExp
41-
>{x: true} : { x: boolean; }
42-
>x : boolean
43-
>true : boolean
41+
>{x: true} : { x: true; }
42+
>x : true
43+
>true : true
4444

4545
x; // boolean
46-
>x : boolean
46+
>x : true
4747

4848
({y: x} = {y: 1});
4949
>({y: x} = {y: 1}) : { y: number; }
@@ -59,16 +59,16 @@ x; // number
5959
>x : number
6060

6161
({x = ""} = {x: true});
62-
>({x = ""} = {x: true}) : { x?: boolean; }
63-
>{x = ""} = {x: true} : { x?: boolean; }
62+
>({x = ""} = {x: true}) : { x?: true; }
63+
>{x = ""} = {x: true} : { x?: true; }
6464
>{x = ""} : { x?: string | number | boolean | RegExp; }
6565
>x : string | number | boolean | RegExp
66-
>{x: true} : { x?: boolean; }
67-
>x : boolean
68-
>true : boolean
66+
>{x: true} : { x?: true; }
67+
>x : true
68+
>true : true
6969

7070
x; // string | boolean
71-
>x : string | boolean
71+
>x : string | true
7272

7373
({y: x = /a/} = {y: 1});
7474
>({y: x = /a/} = {y: 1}) : { y?: number; }

tests/baselines/reference/asyncFunctionReturnType.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ async function fAsyncExplicit(): Promise<[number, boolean]> {
1515

1616
// This is contextually typed as a tuple.
1717
return [1, true];
18-
>[1, true] : [number, boolean]
18+
>[1, true] : [number, true]
1919
>1 : number
20-
>true : boolean
20+
>true : true
2121
}
2222

tests/baselines/reference/bestCommonTypeOfTuple.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function f2(x: number): number { return 10; }
1212
function f3(x: number): boolean { return true; }
1313
>f3 : (x: number) => boolean
1414
>x : number
15-
>true : boolean
15+
>true : true
1616

1717
enum E1 { one }
1818
>E1 : E1

tests/baselines/reference/bitwiseNotOperatorWithBooleanType.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ var BOOLEAN: boolean;
55

66
function foo(): boolean { return true; }
77
>foo : () => boolean
8-
>true : boolean
8+
>true : true
99

1010
class A {
1111
>A : A

tests/baselines/reference/castTest.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var a = <any>0;
2323
var b = <boolean>true;
2424
>b : boolean
2525
><boolean>true : boolean
26-
>true : boolean
26+
>true : true
2727

2828
var s = <string>"";
2929
>s : string

tests/baselines/reference/checkSuperCallBeforeThisAccessing3.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class Derived extends Based {
1818

1919
constructor() {
2020
this.y = true;
21-
>this.y = true : boolean
21+
>this.y = true : true
2222
>this.y : boolean
2323
>this : this
2424
>y : boolean
25-
>true : boolean
25+
>true : true
2626
}
2727
}
2828
super();

tests/baselines/reference/commaOperatorWithSecondOperandBooleanType.types

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -111,32 +111,32 @@ ANY = undefined, BOOLEAN;
111111
>BOOLEAN : boolean
112112

113113
OBJECT = [1, 2, 3], BOOLEAN = false;
114-
>OBJECT = [1, 2, 3], BOOLEAN = false : boolean
114+
>OBJECT = [1, 2, 3], BOOLEAN = false : false
115115
>OBJECT = [1, 2, 3] : number[]
116116
>OBJECT : Object
117117
>[1, 2, 3] : number[]
118118
>1 : number
119119
>2 : number
120120
>3 : number
121-
>BOOLEAN = false : boolean
121+
>BOOLEAN = false : false
122122
>BOOLEAN : boolean
123-
>false : boolean
123+
>false : false
124124

125125
var resultIsBoolean6 = (null, BOOLEAN);
126-
>resultIsBoolean6 : boolean
127-
>(null, BOOLEAN) : boolean
128-
>null, BOOLEAN : boolean
126+
>resultIsBoolean6 : false
127+
>(null, BOOLEAN) : false
128+
>null, BOOLEAN : false
129129
>null : null
130-
>BOOLEAN : boolean
130+
>BOOLEAN : false
131131

132132
var resultIsBoolean7 = (ANY = undefined, BOOLEAN);
133-
>resultIsBoolean7 : boolean
134-
>(ANY = undefined, BOOLEAN) : boolean
135-
>ANY = undefined, BOOLEAN : boolean
133+
>resultIsBoolean7 : false
134+
>(ANY = undefined, BOOLEAN) : false
135+
>ANY = undefined, BOOLEAN : false
136136
>ANY = undefined : undefined
137137
>ANY : any
138138
>undefined : undefined
139-
>BOOLEAN : boolean
139+
>BOOLEAN : false
140140

141141
var resultIsBoolean8 = (1, true);
142142
>resultIsBoolean8 : boolean
@@ -154,27 +154,27 @@ var resultIsBoolean9 = (++NUMBER, true);
154154
>true : boolean
155155

156156
var resultIsBoolean10 = ([1, 2, 3], !BOOLEAN);
157-
>resultIsBoolean10 : boolean
158-
>([1, 2, 3], !BOOLEAN) : boolean
159-
>[1, 2, 3], !BOOLEAN : boolean
157+
>resultIsBoolean10 : true
158+
>([1, 2, 3], !BOOLEAN) : true
159+
>[1, 2, 3], !BOOLEAN : true
160160
>[1, 2, 3] : number[]
161161
>1 : number
162162
>2 : number
163163
>3 : number
164-
>!BOOLEAN : boolean
165-
>BOOLEAN : boolean
164+
>!BOOLEAN : true
165+
>BOOLEAN : false
166166

167167
var resultIsBoolean11 = (OBJECT = [1, 2, 3], BOOLEAN = false);
168-
>resultIsBoolean11 : boolean
169-
>(OBJECT = [1, 2, 3], BOOLEAN = false) : boolean
170-
>OBJECT = [1, 2, 3], BOOLEAN = false : boolean
168+
>resultIsBoolean11 : false
169+
>(OBJECT = [1, 2, 3], BOOLEAN = false) : false
170+
>OBJECT = [1, 2, 3], BOOLEAN = false : false
171171
>OBJECT = [1, 2, 3] : number[]
172172
>OBJECT : Object
173173
>[1, 2, 3] : number[]
174174
>1 : number
175175
>2 : number
176176
>3 : number
177-
>BOOLEAN = false : boolean
177+
>BOOLEAN = false : false
178178
>BOOLEAN : boolean
179-
>false : boolean
179+
>false : false
180180

tests/baselines/reference/commaOperatorWithSecondOperandNumberType.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ true, 1;
9797

9898
BOOLEAN = false, 1;
9999
>BOOLEAN = false, 1 : number
100-
>BOOLEAN = false : boolean
100+
>BOOLEAN = false : false
101101
>BOOLEAN : boolean
102-
>false : boolean
102+
>false : false
103103
>1 : number
104104

105105
"", NUMBER = 1;
@@ -146,9 +146,9 @@ var resultIsNumber9 = (BOOLEAN = false, 1);
146146
>resultIsNumber9 : number
147147
>(BOOLEAN = false, 1) : number
148148
>BOOLEAN = false, 1 : number
149-
>BOOLEAN = false : boolean
149+
>BOOLEAN = false : false
150150
>BOOLEAN : boolean
151-
>false : boolean
151+
>false : false
152152
>1 : number
153153

154154
var resultIsNumber10 = ("", NUMBER = 1);

tests/baselines/reference/commonJSImportNotAsPrimaryExpression.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ var y: typeof foo.C1.s1 = false;
2828
>foo : typeof foo
2929
>C1 : typeof foo.C1
3030
>s1 : boolean
31-
>false : boolean
31+
>false : false
3232

3333
var z: foo.M1.I2;
3434
>z : f.I2

tests/baselines/reference/compoundAdditionAssignmentWithInvalidOperands.errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
tests/cases/conformance/expressions/assignmentOperator/compoundAdditionAssignmentWithInvalidOperands.ts(6,1): error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'void'.
2-
tests/cases/conformance/expressions/assignmentOperator/compoundAdditionAssignmentWithInvalidOperands.ts(7,1): error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'boolean'.
2+
tests/cases/conformance/expressions/assignmentOperator/compoundAdditionAssignmentWithInvalidOperands.ts(7,1): error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'true'.
33
tests/cases/conformance/expressions/assignmentOperator/compoundAdditionAssignmentWithInvalidOperands.ts(8,1): error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'number'.
44
tests/cases/conformance/expressions/assignmentOperator/compoundAdditionAssignmentWithInvalidOperands.ts(9,1): error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'E'.
55
tests/cases/conformance/expressions/assignmentOperator/compoundAdditionAssignmentWithInvalidOperands.ts(10,1): error TS2365: Operator '+=' cannot be applied to types 'boolean' and '{}'.
@@ -38,7 +38,7 @@ tests/cases/conformance/expressions/assignmentOperator/compoundAdditionAssignmen
3838
!!! error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'void'.
3939
x1 += true;
4040
~~~~~~~~~~
41-
!!! error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'boolean'.
41+
!!! error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'true'.
4242
x1 += 0;
4343
~~~~~~~
4444
!!! error TS2365: Operator '+=' cannot be applied to types 'boolean' and 'number'.

tests/baselines/reference/computedPropertyNamesContextualType6_ES5.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ declare function foo<T>(obj: I<T>): T
1919
foo({
2020
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : string | number | boolean | (() => void) | number[]
2121
>foo : <T>(obj: I<T>) => T
22-
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: string]: string | number | boolean | (() => void) | number[]; [x: number]: number | (() => void) | number[]; 0: () => void; p: string; }
22+
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: string]: string | number | true | (() => void) | number[]; [x: number]: number | (() => void) | number[]; 0: () => void; p: string; }
2323

2424
p: "",
2525
>p : string
@@ -32,7 +32,7 @@ foo({
3232
>"hi" + "bye" : string
3333
>"hi" : string
3434
>"bye" : string
35-
>true : boolean
35+
>true : true
3636

3737
[0 + 1]: 0,
3838
>0 + 1 : number

tests/baselines/reference/computedPropertyNamesContextualType6_ES6.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ declare function foo<T>(obj: I<T>): T
1919
foo({
2020
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : string | number | boolean | (() => void) | number[]
2121
>foo : <T>(obj: I<T>) => T
22-
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: string]: string | number | boolean | (() => void) | number[]; [x: number]: number | (() => void) | number[]; 0: () => void; p: string; }
22+
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: string]: string | number | true | (() => void) | number[]; [x: number]: number | (() => void) | number[]; 0: () => void; p: string; }
2323

2424
p: "",
2525
>p : string
@@ -32,7 +32,7 @@ foo({
3232
>"hi" + "bye" : string
3333
>"hi" : string
3434
>"bye" : string
35-
>true : boolean
35+
>true : true
3636

3737
[0 + 1]: 0,
3838
>0 + 1 : number

tests/baselines/reference/conditionalOperatorConditionIsBooleanType.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ true || false ? exprIsObject1 : exprIsObject2;
146146
>true || false ? exprIsObject1 : exprIsObject2 : Object
147147
>true || false : boolean
148148
>true : boolean
149-
>false : boolean
149+
>false : false
150150
>exprIsObject1 : Object
151151
>exprIsObject2 : Object
152152

@@ -291,7 +291,7 @@ var resultIsObject3 = true || false ? exprIsObject1 : exprIsObject2;
291291
>true || false ? exprIsObject1 : exprIsObject2 : Object
292292
>true || false : boolean
293293
>true : boolean
294-
>false : boolean
294+
>false : false
295295
>exprIsObject1 : Object
296296
>exprIsObject2 : Object
297297

tests/baselines/reference/constEnumPropertyAccess1.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ var o: {
3535
>idx : number
3636

3737
} = {
38-
>{ 1: true } : { 1: boolean; }
38+
>{ 1: true } : { 1: true; }
3939

4040
1: true
41-
>true : boolean
41+
>true : true
4242

4343
};
4444

0 commit comments

Comments
 (0)