Skip to content

Commit dbab46c

Browse files
authored
The falsy part of any/unknown is any/unknown (#39529)
1 parent 24832e8 commit dbab46c

8 files changed

+231
-16
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18652,7 +18652,7 @@ namespace ts {
1865218652
type.flags & TypeFlags.BigInt ? zeroBigIntType :
1865318653
type === regularFalseType ||
1865418654
type === falseType ||
18655-
type.flags & (TypeFlags.Void | TypeFlags.Undefined | TypeFlags.Null) ||
18655+
type.flags & (TypeFlags.Void | TypeFlags.Undefined | TypeFlags.Null | TypeFlags.AnyOrUnknown) ||
1865618656
type.flags & TypeFlags.StringLiteral && (<StringLiteralType>type).value === "" ||
1865718657
type.flags & TypeFlags.NumberLiteral && (<NumberLiteralType>type).value === 0 ||
1865818658
type.flags & TypeFlags.BigIntLiteral && isZeroBigInt(<BigIntLiteralType>type) ? type :
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//// [anyAndUnknownHaveFalsyComponents.ts]
2+
declare let x1: any;
3+
const y1 = x1 && 3;
4+
5+
// #39113
6+
declare let isTreeHeader1: any;
7+
function foo1() {
8+
return {
9+
display: "block",
10+
...(isTreeHeader1 && {
11+
display: "flex",
12+
})
13+
};
14+
}
15+
16+
declare let x2: unknown;
17+
const y2 = x2 && 3;
18+
19+
// #39113
20+
declare let isTreeHeader2: unknown;
21+
function foo2() {
22+
return {
23+
display: "block",
24+
...(isTreeHeader1 && {
25+
display: "flex",
26+
})
27+
};
28+
}
29+
30+
31+
//// [anyAndUnknownHaveFalsyComponents.js]
32+
var __assign = (this && this.__assign) || function () {
33+
__assign = Object.assign || function(t) {
34+
for (var s, i = 1, n = arguments.length; i < n; i++) {
35+
s = arguments[i];
36+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
37+
t[p] = s[p];
38+
}
39+
return t;
40+
};
41+
return __assign.apply(this, arguments);
42+
};
43+
var y1 = x1 && 3;
44+
function foo1() {
45+
return __assign({ display: "block" }, (isTreeHeader1 && {
46+
display: "flex"
47+
}));
48+
}
49+
var y2 = x2 && 3;
50+
function foo2() {
51+
return __assign({ display: "block" }, (isTreeHeader1 && {
52+
display: "flex"
53+
}));
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
=== tests/cases/compiler/anyAndUnknownHaveFalsyComponents.ts ===
2+
declare let x1: any;
3+
>x1 : Symbol(x1, Decl(anyAndUnknownHaveFalsyComponents.ts, 0, 11))
4+
5+
const y1 = x1 && 3;
6+
>y1 : Symbol(y1, Decl(anyAndUnknownHaveFalsyComponents.ts, 1, 5))
7+
>x1 : Symbol(x1, Decl(anyAndUnknownHaveFalsyComponents.ts, 0, 11))
8+
9+
// #39113
10+
declare let isTreeHeader1: any;
11+
>isTreeHeader1 : Symbol(isTreeHeader1, Decl(anyAndUnknownHaveFalsyComponents.ts, 4, 11))
12+
13+
function foo1() {
14+
>foo1 : Symbol(foo1, Decl(anyAndUnknownHaveFalsyComponents.ts, 4, 31))
15+
16+
return {
17+
display: "block",
18+
>display : Symbol(display, Decl(anyAndUnknownHaveFalsyComponents.ts, 6, 10))
19+
20+
...(isTreeHeader1 && {
21+
>isTreeHeader1 : Symbol(isTreeHeader1, Decl(anyAndUnknownHaveFalsyComponents.ts, 4, 11))
22+
23+
display: "flex",
24+
>display : Symbol(display, Decl(anyAndUnknownHaveFalsyComponents.ts, 8, 26))
25+
26+
})
27+
};
28+
}
29+
30+
declare let x2: unknown;
31+
>x2 : Symbol(x2, Decl(anyAndUnknownHaveFalsyComponents.ts, 14, 11))
32+
33+
const y2 = x2 && 3;
34+
>y2 : Symbol(y2, Decl(anyAndUnknownHaveFalsyComponents.ts, 15, 5))
35+
>x2 : Symbol(x2, Decl(anyAndUnknownHaveFalsyComponents.ts, 14, 11))
36+
37+
// #39113
38+
declare let isTreeHeader2: unknown;
39+
>isTreeHeader2 : Symbol(isTreeHeader2, Decl(anyAndUnknownHaveFalsyComponents.ts, 18, 11))
40+
41+
function foo2() {
42+
>foo2 : Symbol(foo2, Decl(anyAndUnknownHaveFalsyComponents.ts, 18, 35))
43+
44+
return {
45+
display: "block",
46+
>display : Symbol(display, Decl(anyAndUnknownHaveFalsyComponents.ts, 20, 10))
47+
48+
...(isTreeHeader1 && {
49+
>isTreeHeader1 : Symbol(isTreeHeader1, Decl(anyAndUnknownHaveFalsyComponents.ts, 4, 11))
50+
51+
display: "flex",
52+
>display : Symbol(display, Decl(anyAndUnknownHaveFalsyComponents.ts, 22, 26))
53+
54+
})
55+
};
56+
}
57+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
=== tests/cases/compiler/anyAndUnknownHaveFalsyComponents.ts ===
2+
declare let x1: any;
3+
>x1 : any
4+
5+
const y1 = x1 && 3;
6+
>y1 : any
7+
>x1 && 3 : any
8+
>x1 : any
9+
>3 : 3
10+
11+
// #39113
12+
declare let isTreeHeader1: any;
13+
>isTreeHeader1 : any
14+
15+
function foo1() {
16+
>foo1 : () => any
17+
18+
return {
19+
>{ display: "block", ...(isTreeHeader1 && { display: "flex", }) } : any
20+
21+
display: "block",
22+
>display : string
23+
>"block" : "block"
24+
25+
...(isTreeHeader1 && {
26+
>(isTreeHeader1 && { display: "flex", }) : any
27+
>isTreeHeader1 && { display: "flex", } : any
28+
>isTreeHeader1 : any
29+
>{ display: "flex", } : { display: string; }
30+
31+
display: "flex",
32+
>display : string
33+
>"flex" : "flex"
34+
35+
})
36+
};
37+
}
38+
39+
declare let x2: unknown;
40+
>x2 : unknown
41+
42+
const y2 = x2 && 3;
43+
>y2 : unknown
44+
>x2 && 3 : unknown
45+
>x2 : unknown
46+
>3 : 3
47+
48+
// #39113
49+
declare let isTreeHeader2: unknown;
50+
>isTreeHeader2 : unknown
51+
52+
function foo2() {
53+
>foo2 : () => any
54+
55+
return {
56+
>{ display: "block", ...(isTreeHeader1 && { display: "flex", }) } : any
57+
58+
display: "block",
59+
>display : string
60+
>"block" : "block"
61+
62+
...(isTreeHeader1 && {
63+
>(isTreeHeader1 && { display: "flex", }) : any
64+
>isTreeHeader1 && { display: "flex", } : any
65+
>isTreeHeader1 : any
66+
>{ display: "flex", } : { display: string; }
67+
68+
display: "flex",
69+
>display : string
70+
>"flex" : "flex"
71+
72+
})
73+
};
74+
}
75+

tests/baselines/reference/contextualExpressionTypecheckingDoesntBlowStack.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export default class Operation {
5959
>name : any
6060

6161
if(innerResult && innerResult.length > 0) {
62-
>innerResult && innerResult.length > 0 : boolean
62+
>innerResult && innerResult.length > 0 : any
6363
>innerResult : any
6464
>innerResult.length > 0 : boolean
6565
>innerResult.length : any

tests/baselines/reference/controlFlowCaching.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,8 @@ function f(dim, offsets, arr, acommon, centerAnchorLimit, g, has, lin) {
539539
>titleRotation = (taTitleOrientation && taTitleOrientation == "away") ? 180 : 0 : 0 | 180
540540
>titleRotation : number
541541
>(taTitleOrientation && taTitleOrientation == "away") ? 180 : 0 : 0 | 180
542-
>(taTitleOrientation && taTitleOrientation == "away") : boolean
543-
>taTitleOrientation && taTitleOrientation == "away" : boolean
542+
>(taTitleOrientation && taTitleOrientation == "away") : any
543+
>taTitleOrientation && taTitleOrientation == "away" : any
544544
>taTitleOrientation : any
545545
>taTitleOrientation == "away" : boolean
546546
>taTitleOrientation : any

tests/baselines/reference/narrowingTruthyObject.types

+12-12
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ function foo(x: unknown, b: boolean) {
3131
>toString : () => string
3232
}
3333
if (x && typeof x === 'object') {
34-
>x && typeof x === 'object' : boolean
34+
>x && typeof x === 'object' : unknown
3535
>x : unknown
3636
>typeof x === 'object' : boolean
3737
>typeof x : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"
@@ -45,7 +45,7 @@ function foo(x: unknown, b: boolean) {
4545
>toString : () => string
4646
}
4747
if (b && x && typeof x === 'object') {
48-
>b && x && typeof x === 'object' : boolean
48+
>b && x && typeof x === 'object' : unknown
4949
>b && x : unknown
5050
>b : boolean
5151
>x : unknown
@@ -61,8 +61,8 @@ function foo(x: unknown, b: boolean) {
6161
>toString : () => string
6262
}
6363
if (x && b && typeof x === 'object') {
64-
>x && b && typeof x === 'object' : boolean
65-
>x && b : boolean
64+
>x && b && typeof x === 'object' : unknown
65+
>x && b : unknown
6666
>x : unknown
6767
>b : boolean
6868
>typeof x === 'object' : boolean
@@ -77,9 +77,9 @@ function foo(x: unknown, b: boolean) {
7777
>toString : () => string
7878
}
7979
if (x && b && b && typeof x === 'object') {
80-
>x && b && b && typeof x === 'object' : boolean
81-
>x && b && b : boolean
82-
>x && b : boolean
80+
>x && b && b && typeof x === 'object' : unknown
81+
>x && b && b : unknown
82+
>x && b : unknown
8383
>x : unknown
8484
>b : boolean
8585
>b : true
@@ -95,9 +95,9 @@ function foo(x: unknown, b: boolean) {
9595
>toString : () => string
9696
}
9797
if (b && b && x && b && b && typeof x === 'object') {
98-
>b && b && x && b && b && typeof x === 'object' : boolean
99-
>b && b && x && b && b : true
100-
>b && b && x && b : true
98+
>b && b && x && b && b && typeof x === 'object' : unknown
99+
>b && b && x && b && b : unknown
100+
>b && b && x && b : unknown
101101
>b && b && x : unknown
102102
>b && b : boolean
103103
>b : boolean
@@ -125,8 +125,8 @@ function f1(x: unknown): any {
125125
>x : unknown
126126

127127
return x && typeof x === 'object' && x.hasOwnProperty('x');
128-
>x && typeof x === 'object' && x.hasOwnProperty('x') : boolean
129-
>x && typeof x === 'object' : boolean
128+
>x && typeof x === 'object' && x.hasOwnProperty('x') : unknown
129+
>x && typeof x === 'object' : unknown
130130
>x : unknown
131131
>typeof x === 'object' : boolean
132132
>typeof x : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// @strictNullChecks: true
2+
3+
declare let x1: any;
4+
const y1 = x1 && 3;
5+
6+
// #39113
7+
declare let isTreeHeader1: any;
8+
function foo1() {
9+
return {
10+
display: "block",
11+
...(isTreeHeader1 && {
12+
display: "flex",
13+
})
14+
};
15+
}
16+
17+
declare let x2: unknown;
18+
const y2 = x2 && 3;
19+
20+
// #39113
21+
declare let isTreeHeader2: unknown;
22+
function foo2() {
23+
return {
24+
display: "block",
25+
...(isTreeHeader1 && {
26+
display: "flex",
27+
})
28+
};
29+
}

0 commit comments

Comments
 (0)