Skip to content

Commit 36cc154

Browse files
committed
Narrow to any primitive or object and update tests
1 parent 1f2338b commit 36cc154

File tree

6 files changed

+554
-10
lines changed

6 files changed

+554
-10
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16018,8 +16018,14 @@ namespace ts {
1601816018
assumeTrue = !assumeTrue;
1601916019
}
1602016020
const valueType = getTypeOfExpression(value);
16021-
if ((type.flags & TypeFlags.Unknown) && (operator === SyntaxKind.EqualsEqualsEqualsToken) && (valueType.flags & TypeFlags.Unit)) {
16022-
return assumeTrue ? valueType : type;
16021+
if ((type.flags & TypeFlags.Unknown) && (operator === SyntaxKind.EqualsEqualsEqualsToken) && assumeTrue) {
16022+
if (valueType.flags & TypeFlags.Primitive || valueType.flags & TypeFlags.NonPrimitive) {
16023+
return valueType;
16024+
}
16025+
if (valueType.flags & TypeFlags.Object) {
16026+
return nonPrimitiveType;
16027+
}
16028+
return type;
1602316029
}
1602416030
if (valueType.flags & TypeFlags.Nullable) {
1602516031
if (!strictNullChecks) {

tests/baselines/reference/unknownType2.js

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ if (u === symb) {
3131

3232
if (!(u === 42)) {
3333
type A = isTrue<isUnknown<typeof u>>
34-
3534
}
3635

3736
if (u !== 42) {
@@ -49,6 +48,71 @@ if (u == true) {
4948
if (u == Object) {
5049
type E = isTrue<isUnknown<typeof u>>
5150
}
51+
52+
declare const aString: string;
53+
declare const aBoolean: boolean;
54+
declare const aNumber: number;
55+
declare const anObject: object;
56+
declare const anObjectLiteral: { x: number };
57+
declare const aUnion: { x: number } | { y: string };
58+
declare const anIntersection: { x: number } & { y: string };
59+
declare const aFunction: () => number;
60+
61+
if (u === aString) {
62+
let uString: string = u;
63+
}
64+
65+
if (u === aBoolean) {
66+
let uString: boolean = u;
67+
}
68+
69+
if (u === aNumber) {
70+
let uNumber: number = u;
71+
}
72+
73+
if (u === anObject) {
74+
let uObject: object = u;
75+
}
76+
77+
if (u === anObjectLiteral) {
78+
let uObjectLiteral: object = u;
79+
}
80+
81+
if (u === aUnion) {
82+
type unionDoesNotNarrow = isTrue<isUnknown<typeof u>>
83+
}
84+
85+
if (u === anIntersection) {
86+
type intersectionDoesNotNarrow = isTrue<isUnknown<typeof u>>
87+
}
88+
89+
if (u === aFunction) {
90+
let uFunction: object = u;
91+
}
92+
93+
enum NumberEnum {
94+
A,
95+
B,
96+
C
97+
}
98+
99+
enum StringEnum {
100+
A = "A",
101+
B = "B",
102+
C = "C"
103+
}
104+
105+
if (u === NumberEnum || u === StringEnum) {
106+
let enumObj: object = u;
107+
}
108+
109+
if(u === NumberEnum.A) {
110+
let a: NumberEnum.A = u
111+
}
112+
113+
if(u === StringEnum.B) {
114+
let b: StringEnum.B = u
115+
}
52116

53117

54118
//// [unknownType2.js]
@@ -80,3 +144,46 @@ if (u == true) {
80144
}
81145
if (u == Object) {
82146
}
147+
if (u === aString) {
148+
var uString = u;
149+
}
150+
if (u === aBoolean) {
151+
var uString = u;
152+
}
153+
if (u === aNumber) {
154+
var uNumber = u;
155+
}
156+
if (u === anObject) {
157+
var uObject = u;
158+
}
159+
if (u === anObjectLiteral) {
160+
var uObjectLiteral = u;
161+
}
162+
if (u === aUnion) {
163+
}
164+
if (u === anIntersection) {
165+
}
166+
if (u === aFunction) {
167+
var uFunction = u;
168+
}
169+
var NumberEnum;
170+
(function (NumberEnum) {
171+
NumberEnum[NumberEnum["A"] = 0] = "A";
172+
NumberEnum[NumberEnum["B"] = 1] = "B";
173+
NumberEnum[NumberEnum["C"] = 2] = "C";
174+
})(NumberEnum || (NumberEnum = {}));
175+
var StringEnum;
176+
(function (StringEnum) {
177+
StringEnum["A"] = "A";
178+
StringEnum["B"] = "B";
179+
StringEnum["C"] = "C";
180+
})(StringEnum || (StringEnum = {}));
181+
if (u === NumberEnum || u === StringEnum) {
182+
var enumObj = u;
183+
}
184+
if (u === NumberEnum.A) {
185+
var a = u;
186+
}
187+
if (u === StringEnum.B) {
188+
var b = u;
189+
}

tests/baselines/reference/unknownType2.symbols

Lines changed: 172 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,13 @@ if (!(u === 42)) {
8282
>isTrue : Symbol(isTrue, Decl(unknownType2.ts, 0, 53))
8383
>isUnknown : Symbol(isUnknown, Decl(unknownType2.ts, 0, 0))
8484
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
85-
8685
}
8786

8887
if (u !== 42) {
8988
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
9089

9190
type B = isTrue<isUnknown<typeof u>>
92-
>B : Symbol(B, Decl(unknownType2.ts, 35, 15))
91+
>B : Symbol(B, Decl(unknownType2.ts, 34, 15))
9392
>isTrue : Symbol(isTrue, Decl(unknownType2.ts, 0, 53))
9493
>isUnknown : Symbol(isUnknown, Decl(unknownType2.ts, 0, 0))
9594
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
@@ -99,7 +98,7 @@ if (u == 42) {
9998
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
10099

101100
type C = isTrue<isUnknown<typeof u>>
102-
>C : Symbol(C, Decl(unknownType2.ts, 39, 14))
101+
>C : Symbol(C, Decl(unknownType2.ts, 38, 14))
103102
>isTrue : Symbol(isTrue, Decl(unknownType2.ts, 0, 53))
104103
>isUnknown : Symbol(isUnknown, Decl(unknownType2.ts, 0, 0))
105104
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
@@ -109,7 +108,7 @@ if (u == true) {
109108
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
110109

111110
type D = isTrue<isUnknown<typeof u>>
112-
>D : Symbol(D, Decl(unknownType2.ts, 43, 16))
111+
>D : Symbol(D, Decl(unknownType2.ts, 42, 16))
113112
>isTrue : Symbol(isTrue, Decl(unknownType2.ts, 0, 53))
114113
>isUnknown : Symbol(isUnknown, Decl(unknownType2.ts, 0, 0))
115114
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
@@ -120,9 +119,177 @@ if (u == Object) {
120119
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
121120

122121
type E = isTrue<isUnknown<typeof u>>
123-
>E : Symbol(E, Decl(unknownType2.ts, 47, 18))
122+
>E : Symbol(E, Decl(unknownType2.ts, 46, 18))
124123
>isTrue : Symbol(isTrue, Decl(unknownType2.ts, 0, 53))
125124
>isUnknown : Symbol(isUnknown, Decl(unknownType2.ts, 0, 0))
126125
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
127126
}
128127

128+
declare const aString: string;
129+
>aString : Symbol(aString, Decl(unknownType2.ts, 50, 13))
130+
131+
declare const aBoolean: boolean;
132+
>aBoolean : Symbol(aBoolean, Decl(unknownType2.ts, 51, 13))
133+
134+
declare const aNumber: number;
135+
>aNumber : Symbol(aNumber, Decl(unknownType2.ts, 52, 13))
136+
137+
declare const anObject: object;
138+
>anObject : Symbol(anObject, Decl(unknownType2.ts, 53, 13))
139+
140+
declare const anObjectLiteral: { x: number };
141+
>anObjectLiteral : Symbol(anObjectLiteral, Decl(unknownType2.ts, 54, 13))
142+
>x : Symbol(x, Decl(unknownType2.ts, 54, 32))
143+
144+
declare const aUnion: { x: number } | { y: string };
145+
>aUnion : Symbol(aUnion, Decl(unknownType2.ts, 55, 13))
146+
>x : Symbol(x, Decl(unknownType2.ts, 55, 23))
147+
>y : Symbol(y, Decl(unknownType2.ts, 55, 39))
148+
149+
declare const anIntersection: { x: number } & { y: string };
150+
>anIntersection : Symbol(anIntersection, Decl(unknownType2.ts, 56, 13))
151+
>x : Symbol(x, Decl(unknownType2.ts, 56, 31))
152+
>y : Symbol(y, Decl(unknownType2.ts, 56, 47))
153+
154+
declare const aFunction: () => number;
155+
>aFunction : Symbol(aFunction, Decl(unknownType2.ts, 57, 13))
156+
157+
if (u === aString) {
158+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
159+
>aString : Symbol(aString, Decl(unknownType2.ts, 50, 13))
160+
161+
let uString: string = u;
162+
>uString : Symbol(uString, Decl(unknownType2.ts, 60, 7))
163+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
164+
}
165+
166+
if (u === aBoolean) {
167+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
168+
>aBoolean : Symbol(aBoolean, Decl(unknownType2.ts, 51, 13))
169+
170+
let uString: boolean = u;
171+
>uString : Symbol(uString, Decl(unknownType2.ts, 64, 7))
172+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
173+
}
174+
175+
if (u === aNumber) {
176+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
177+
>aNumber : Symbol(aNumber, Decl(unknownType2.ts, 52, 13))
178+
179+
let uNumber: number = u;
180+
>uNumber : Symbol(uNumber, Decl(unknownType2.ts, 68, 7))
181+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
182+
}
183+
184+
if (u === anObject) {
185+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
186+
>anObject : Symbol(anObject, Decl(unknownType2.ts, 53, 13))
187+
188+
let uObject: object = u;
189+
>uObject : Symbol(uObject, Decl(unknownType2.ts, 72, 7))
190+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
191+
}
192+
193+
if (u === anObjectLiteral) {
194+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
195+
>anObjectLiteral : Symbol(anObjectLiteral, Decl(unknownType2.ts, 54, 13))
196+
197+
let uObjectLiteral: object = u;
198+
>uObjectLiteral : Symbol(uObjectLiteral, Decl(unknownType2.ts, 76, 7))
199+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
200+
}
201+
202+
if (u === aUnion) {
203+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
204+
>aUnion : Symbol(aUnion, Decl(unknownType2.ts, 55, 13))
205+
206+
type unionDoesNotNarrow = isTrue<isUnknown<typeof u>>
207+
>unionDoesNotNarrow : Symbol(unionDoesNotNarrow, Decl(unknownType2.ts, 79, 19))
208+
>isTrue : Symbol(isTrue, Decl(unknownType2.ts, 0, 53))
209+
>isUnknown : Symbol(isUnknown, Decl(unknownType2.ts, 0, 0))
210+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
211+
}
212+
213+
if (u === anIntersection) {
214+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
215+
>anIntersection : Symbol(anIntersection, Decl(unknownType2.ts, 56, 13))
216+
217+
type intersectionDoesNotNarrow = isTrue<isUnknown<typeof u>>
218+
>intersectionDoesNotNarrow : Symbol(intersectionDoesNotNarrow, Decl(unknownType2.ts, 83, 27))
219+
>isTrue : Symbol(isTrue, Decl(unknownType2.ts, 0, 53))
220+
>isUnknown : Symbol(isUnknown, Decl(unknownType2.ts, 0, 0))
221+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
222+
}
223+
224+
if (u === aFunction) {
225+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
226+
>aFunction : Symbol(aFunction, Decl(unknownType2.ts, 57, 13))
227+
228+
let uFunction: object = u;
229+
>uFunction : Symbol(uFunction, Decl(unknownType2.ts, 88, 7))
230+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
231+
}
232+
233+
enum NumberEnum {
234+
>NumberEnum : Symbol(NumberEnum, Decl(unknownType2.ts, 89, 1))
235+
236+
A,
237+
>A : Symbol(NumberEnum.A, Decl(unknownType2.ts, 91, 17))
238+
239+
B,
240+
>B : Symbol(NumberEnum.B, Decl(unknownType2.ts, 92, 6))
241+
242+
C
243+
>C : Symbol(NumberEnum.C, Decl(unknownType2.ts, 93, 6))
244+
}
245+
246+
enum StringEnum {
247+
>StringEnum : Symbol(StringEnum, Decl(unknownType2.ts, 95, 1))
248+
249+
A = "A",
250+
>A : Symbol(StringEnum.A, Decl(unknownType2.ts, 97, 17))
251+
252+
B = "B",
253+
>B : Symbol(StringEnum.B, Decl(unknownType2.ts, 98, 12))
254+
255+
C = "C"
256+
>C : Symbol(StringEnum.C, Decl(unknownType2.ts, 99, 12))
257+
}
258+
259+
if (u === NumberEnum || u === StringEnum) {
260+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
261+
>NumberEnum : Symbol(NumberEnum, Decl(unknownType2.ts, 89, 1))
262+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
263+
>StringEnum : Symbol(StringEnum, Decl(unknownType2.ts, 95, 1))
264+
265+
let enumObj: object = u;
266+
>enumObj : Symbol(enumObj, Decl(unknownType2.ts, 104, 7))
267+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
268+
}
269+
270+
if(u === NumberEnum.A) {
271+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
272+
>NumberEnum.A : Symbol(NumberEnum.A, Decl(unknownType2.ts, 91, 17))
273+
>NumberEnum : Symbol(NumberEnum, Decl(unknownType2.ts, 89, 1))
274+
>A : Symbol(NumberEnum.A, Decl(unknownType2.ts, 91, 17))
275+
276+
let a: NumberEnum.A = u
277+
>a : Symbol(a, Decl(unknownType2.ts, 108, 7))
278+
>NumberEnum : Symbol(NumberEnum, Decl(unknownType2.ts, 89, 1))
279+
>A : Symbol(NumberEnum.A, Decl(unknownType2.ts, 91, 17))
280+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
281+
}
282+
283+
if(u === StringEnum.B) {
284+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
285+
>StringEnum.B : Symbol(StringEnum.B, Decl(unknownType2.ts, 98, 12))
286+
>StringEnum : Symbol(StringEnum, Decl(unknownType2.ts, 95, 1))
287+
>B : Symbol(StringEnum.B, Decl(unknownType2.ts, 98, 12))
288+
289+
let b: StringEnum.B = u
290+
>b : Symbol(b, Decl(unknownType2.ts, 112, 7))
291+
>StringEnum : Symbol(StringEnum, Decl(unknownType2.ts, 95, 1))
292+
>B : Symbol(StringEnum.B, Decl(unknownType2.ts, 98, 12))
293+
>u : Symbol(u, Decl(unknownType2.ts, 6, 5))
294+
}
295+

0 commit comments

Comments
 (0)