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:
Anders Hejlsberg
2020-04-20 11:04:24 -07:00
committed by GitHub
parent 38f8db5e45
commit 5d78cbdbbd
5 changed files with 50 additions and 1 deletions

View File

@@ -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) {

View 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() || []);

View 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))

View 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[]

View File

@@ -0,0 +1,6 @@
// @strict: true
declare function resolver<T>(): () => void;
declare function wrapResolver<T>(resolverFunction: () => void): void;
wrapResolver(resolver() || []);