Skip to content

Commit 5d78cbd

Browse files
authored
Propagate nonInferrableType in &&, || and ?? operators (#38035)
* Propagate nonInferrableType in &&, || and ?? operators * Add regression test * Simpler solution: getTypeFacts(neverType) should return TypeFacts.None
1 parent 38f8db5 commit 5d78cbd

File tree

5 files changed

+50
-1
lines changed

5 files changed

+50
-1
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19390,6 +19390,9 @@ namespace ts {
1939019390
if (flags & TypeFlags.NonPrimitive) {
1939119391
return strictNullChecks ? TypeFacts.ObjectStrictFacts : TypeFacts.ObjectFacts;
1939219392
}
19393+
if (flags & TypeFlags.Never) {
19394+
return TypeFacts.None;
19395+
}
1939319396
if (flags & TypeFlags.Instantiable) {
1939419397
return getTypeFacts(getBaseConstraintOfType(type) || unknownType);
1939519398
}
@@ -19626,7 +19629,7 @@ namespace ts {
1962619629
const filtered = filter(types, f);
1962719630
return filtered === types ? type : getUnionTypeFromSortedList(filtered, (<UnionType>type).objectFlags);
1962819631
}
19629-
return f(type) ? type : neverType;
19632+
return type.flags & TypeFlags.Never || f(type) ? type : neverType;
1963019633
}
1963119634

1963219635
function countTypes(type: Type) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//// [propagateNonInferrableType.ts]
2+
declare function resolver<T>(): () => void;
3+
declare function wrapResolver<T>(resolverFunction: () => void): void;
4+
5+
wrapResolver(resolver() || []);
6+
7+
8+
//// [propagateNonInferrableType.js]
9+
"use strict";
10+
wrapResolver(resolver() || []);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
=== tests/cases/compiler/propagateNonInferrableType.ts ===
2+
declare function resolver<T>(): () => void;
3+
>resolver : Symbol(resolver, Decl(propagateNonInferrableType.ts, 0, 0))
4+
>T : Symbol(T, Decl(propagateNonInferrableType.ts, 0, 26))
5+
6+
declare function wrapResolver<T>(resolverFunction: () => void): void;
7+
>wrapResolver : Symbol(wrapResolver, Decl(propagateNonInferrableType.ts, 0, 43))
8+
>T : Symbol(T, Decl(propagateNonInferrableType.ts, 1, 30))
9+
>resolverFunction : Symbol(resolverFunction, Decl(propagateNonInferrableType.ts, 1, 33))
10+
11+
wrapResolver(resolver() || []);
12+
>wrapResolver : Symbol(wrapResolver, Decl(propagateNonInferrableType.ts, 0, 43))
13+
>resolver : Symbol(resolver, Decl(propagateNonInferrableType.ts, 0, 0))
14+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
=== tests/cases/compiler/propagateNonInferrableType.ts ===
2+
declare function resolver<T>(): () => void;
3+
>resolver : <T>() => () => void
4+
5+
declare function wrapResolver<T>(resolverFunction: () => void): void;
6+
>wrapResolver : <T>(resolverFunction: () => void) => void
7+
>resolverFunction : () => void
8+
9+
wrapResolver(resolver() || []);
10+
>wrapResolver(resolver() || []) : void
11+
>wrapResolver : <T>(resolverFunction: () => void) => void
12+
>resolver() || [] : () => void
13+
>resolver() : () => void
14+
>resolver : <T>() => () => void
15+
>[] : never[]
16+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @strict: true
2+
3+
declare function resolver<T>(): () => void;
4+
declare function wrapResolver<T>(resolverFunction: () => void): void;
5+
6+
wrapResolver(resolver() || []);

0 commit comments

Comments
 (0)