mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-15 21:36:50 -05:00
Propagate nonInferrableType in &&, || and ?? operators (#38035)
* Propagate nonInferrableType in &&, || and ?? operators * Add regression test * Simpler solution: getTypeFacts(neverType) should return TypeFacts.None
This commit is contained in:
@@ -19390,6 +19390,9 @@ namespace ts {
|
||||
if (flags & TypeFlags.NonPrimitive) {
|
||||
return strictNullChecks ? TypeFacts.ObjectStrictFacts : TypeFacts.ObjectFacts;
|
||||
}
|
||||
if (flags & TypeFlags.Never) {
|
||||
return TypeFacts.None;
|
||||
}
|
||||
if (flags & TypeFlags.Instantiable) {
|
||||
return getTypeFacts(getBaseConstraintOfType(type) || unknownType);
|
||||
}
|
||||
@@ -19626,7 +19629,7 @@ namespace ts {
|
||||
const filtered = filter(types, f);
|
||||
return filtered === types ? type : getUnionTypeFromSortedList(filtered, (<UnionType>type).objectFlags);
|
||||
}
|
||||
return f(type) ? type : neverType;
|
||||
return type.flags & TypeFlags.Never || f(type) ? type : neverType;
|
||||
}
|
||||
|
||||
function countTypes(type: Type) {
|
||||
|
||||
10
tests/baselines/reference/propagateNonInferrableType.js
Normal file
10
tests/baselines/reference/propagateNonInferrableType.js
Normal file
@@ -0,0 +1,10 @@
|
||||
//// [propagateNonInferrableType.ts]
|
||||
declare function resolver<T>(): () => void;
|
||||
declare function wrapResolver<T>(resolverFunction: () => void): void;
|
||||
|
||||
wrapResolver(resolver() || []);
|
||||
|
||||
|
||||
//// [propagateNonInferrableType.js]
|
||||
"use strict";
|
||||
wrapResolver(resolver() || []);
|
||||
14
tests/baselines/reference/propagateNonInferrableType.symbols
Normal file
14
tests/baselines/reference/propagateNonInferrableType.symbols
Normal file
@@ -0,0 +1,14 @@
|
||||
=== tests/cases/compiler/propagateNonInferrableType.ts ===
|
||||
declare function resolver<T>(): () => void;
|
||||
>resolver : Symbol(resolver, Decl(propagateNonInferrableType.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(propagateNonInferrableType.ts, 0, 26))
|
||||
|
||||
declare function wrapResolver<T>(resolverFunction: () => void): void;
|
||||
>wrapResolver : Symbol(wrapResolver, Decl(propagateNonInferrableType.ts, 0, 43))
|
||||
>T : Symbol(T, Decl(propagateNonInferrableType.ts, 1, 30))
|
||||
>resolverFunction : Symbol(resolverFunction, Decl(propagateNonInferrableType.ts, 1, 33))
|
||||
|
||||
wrapResolver(resolver() || []);
|
||||
>wrapResolver : Symbol(wrapResolver, Decl(propagateNonInferrableType.ts, 0, 43))
|
||||
>resolver : Symbol(resolver, Decl(propagateNonInferrableType.ts, 0, 0))
|
||||
|
||||
16
tests/baselines/reference/propagateNonInferrableType.types
Normal file
16
tests/baselines/reference/propagateNonInferrableType.types
Normal file
@@ -0,0 +1,16 @@
|
||||
=== tests/cases/compiler/propagateNonInferrableType.ts ===
|
||||
declare function resolver<T>(): () => void;
|
||||
>resolver : <T>() => () => void
|
||||
|
||||
declare function wrapResolver<T>(resolverFunction: () => void): void;
|
||||
>wrapResolver : <T>(resolverFunction: () => void) => void
|
||||
>resolverFunction : () => void
|
||||
|
||||
wrapResolver(resolver() || []);
|
||||
>wrapResolver(resolver() || []) : void
|
||||
>wrapResolver : <T>(resolverFunction: () => void) => void
|
||||
>resolver() || [] : () => void
|
||||
>resolver() : () => void
|
||||
>resolver : <T>() => () => void
|
||||
>[] : never[]
|
||||
|
||||
6
tests/cases/compiler/propagateNonInferrableType.ts
Normal file
6
tests/cases/compiler/propagateNonInferrableType.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
// @strict: true
|
||||
|
||||
declare function resolver<T>(): () => void;
|
||||
declare function wrapResolver<T>(resolverFunction: () => void): void;
|
||||
|
||||
wrapResolver(resolver() || []);
|
||||
Reference in New Issue
Block a user