Skip to content

Commit e3b542b

Browse files
committed
Improve detection of type variables in instantiated object types
1 parent ddcbd9f commit e3b542b

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18686,6 +18686,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1868618686
result = target.objectFlags & ObjectFlags.Reference ? createDeferredTypeReference((type as DeferredTypeReference).target, (type as DeferredTypeReference).node, newMapper, newAliasSymbol, newAliasTypeArguments) :
1868718687
target.objectFlags & ObjectFlags.Mapped ? instantiateMappedType(target as MappedType, newMapper, newAliasSymbol, newAliasTypeArguments) :
1868818688
instantiateAnonymousType(target, newMapper, newAliasSymbol, newAliasTypeArguments);
18689+
// If none of the type arguments for the outer type parameters contain type variables, it follows
18690+
// that the instantiated type doesn't reference type variables.
18691+
if (result.flags & TypeFlags.ObjectFlagsType && !((result as ObjectFlagsType).objectFlags & ObjectFlags.CouldContainTypeVariablesComputed)) {
18692+
(result as ObjectFlagsType).objectFlags |= ObjectFlags.CouldContainTypeVariablesComputed |
18693+
(some(typeArguments, couldContainTypeVariables) ? ObjectFlags.CouldContainTypeVariables : 0);
18694+
}
1868918695
target.instantiations.set(id, result);
1869018696
}
1869118697
return result;
@@ -18856,7 +18862,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1885618862
}
1885718863

1885818864
function instantiateAnonymousType(type: AnonymousType, mapper: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]): AnonymousType {
18859-
const result = createObjectType(type.objectFlags | ObjectFlags.Instantiated, type.symbol) as AnonymousType;
18865+
const result = createObjectType(type.objectFlags & ~(ObjectFlags.CouldContainTypeVariablesComputed | ObjectFlags.CouldContainTypeVariables) | ObjectFlags.Instantiated, type.symbol) as AnonymousType;
1886018866
if (type.objectFlags & ObjectFlags.Mapped) {
1886118867
(result as MappedType).declaration = (type as MappedType).declaration;
1886218868
// C.f. instantiateSignature
@@ -23858,7 +23864,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2385823864
}
2385923865
const result = !!(type.flags & TypeFlags.Instantiable ||
2386023866
type.flags & TypeFlags.Object && !isNonGenericTopLevelType(type) && (
23861-
objectFlags & ObjectFlags.Reference && ((type as TypeReference).node || forEach(getTypeArguments(type as TypeReference), couldContainTypeVariables)) ||
23867+
objectFlags & ObjectFlags.Reference && ((type as TypeReference).node || some(getTypeArguments(type as TypeReference), couldContainTypeVariables)) ||
2386223868
objectFlags & ObjectFlags.Anonymous && type.symbol && type.symbol.flags & (SymbolFlags.Function | SymbolFlags.Method | SymbolFlags.Class | SymbolFlags.TypeLiteral | SymbolFlags.ObjectLiteral) && type.symbol.declarations ||
2386323869
objectFlags & (ObjectFlags.Mapped | ObjectFlags.ReverseMapped | ObjectFlags.ObjectRestType | ObjectFlags.InstantiationExpressionType)) ||
2386423870
type.flags & TypeFlags.UnionOrIntersection && !(type.flags & TypeFlags.EnumLiteral) && !isNonGenericTopLevelType(type) && some((type as UnionOrIntersectionType).types, couldContainTypeVariables));

0 commit comments

Comments
 (0)