diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 087353fb9fdc3..5eb685cb61c4f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -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, (type).objectFlags); } - return f(type) ? type : neverType; + return type.flags & TypeFlags.Never || f(type) ? type : neverType; } function countTypes(type: Type) { diff --git a/tests/baselines/reference/propagateNonInferrableType.js b/tests/baselines/reference/propagateNonInferrableType.js new file mode 100644 index 0000000000000..b245899049db9 --- /dev/null +++ b/tests/baselines/reference/propagateNonInferrableType.js @@ -0,0 +1,10 @@ +//// [propagateNonInferrableType.ts] +declare function resolver(): () => void; +declare function wrapResolver(resolverFunction: () => void): void; + +wrapResolver(resolver() || []); + + +//// [propagateNonInferrableType.js] +"use strict"; +wrapResolver(resolver() || []); diff --git a/tests/baselines/reference/propagateNonInferrableType.symbols b/tests/baselines/reference/propagateNonInferrableType.symbols new file mode 100644 index 0000000000000..628922c236616 --- /dev/null +++ b/tests/baselines/reference/propagateNonInferrableType.symbols @@ -0,0 +1,14 @@ +=== tests/cases/compiler/propagateNonInferrableType.ts === +declare function resolver(): () => void; +>resolver : Symbol(resolver, Decl(propagateNonInferrableType.ts, 0, 0)) +>T : Symbol(T, Decl(propagateNonInferrableType.ts, 0, 26)) + +declare function wrapResolver(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)) + diff --git a/tests/baselines/reference/propagateNonInferrableType.types b/tests/baselines/reference/propagateNonInferrableType.types new file mode 100644 index 0000000000000..f4aa66d6ccfd7 --- /dev/null +++ b/tests/baselines/reference/propagateNonInferrableType.types @@ -0,0 +1,16 @@ +=== tests/cases/compiler/propagateNonInferrableType.ts === +declare function resolver(): () => void; +>resolver : () => () => void + +declare function wrapResolver(resolverFunction: () => void): void; +>wrapResolver : (resolverFunction: () => void) => void +>resolverFunction : () => void + +wrapResolver(resolver() || []); +>wrapResolver(resolver() || []) : void +>wrapResolver : (resolverFunction: () => void) => void +>resolver() || [] : () => void +>resolver() : () => void +>resolver : () => () => void +>[] : never[] + diff --git a/tests/cases/compiler/propagateNonInferrableType.ts b/tests/cases/compiler/propagateNonInferrableType.ts new file mode 100644 index 0000000000000..051eb7b083f46 --- /dev/null +++ b/tests/cases/compiler/propagateNonInferrableType.ts @@ -0,0 +1,6 @@ +// @strict: true + +declare function resolver(): () => void; +declare function wrapResolver(resolverFunction: () => void): void; + +wrapResolver(resolver() || []);