diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 98a459b6ccd3d..2415ddc03cd6e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -392,6 +392,7 @@ namespace ts { const literalTypes = createMap(); const indexedAccessTypes = createMap(); const conditionalTypes = createMap(); + const substitutionTypes = createMap(); const evolvingArrayTypes: EvolvingArrayType[] = []; const undefinedProperties = createMap() as UnderscoreEscapedMap; @@ -8870,9 +8871,15 @@ namespace ts { if (substitute.flags & TypeFlags.AnyOrUnknown) { return typeVariable; } + const id = `${getTypeId(typeVariable)}>${getTypeId(substitute)}`; + const cached = substitutionTypes.get(id); + if (cached) { + return cached; + } const result = createType(TypeFlags.Substitution); result.typeVariable = typeVariable; result.substitute = substitute; + substitutionTypes.set(id, result); return result; } diff --git a/tests/baselines/reference/inlinedAliasAssignableToConstraintSameAsAlias.types b/tests/baselines/reference/inlinedAliasAssignableToConstraintSameAsAlias.types index d337fbc718abb..086aa5c976e7c 100644 --- a/tests/baselines/reference/inlinedAliasAssignableToConstraintSameAsAlias.types +++ b/tests/baselines/reference/inlinedAliasAssignableToConstraintSameAsAlias.types @@ -31,7 +31,7 @@ class A { >z : A[] whereRelated< // Works // Type is same as A1, but is not assignable to type A ->whereRelated : >() => number +>whereRelated : () => number RF extends RelationFields = RelationFields, N extends Name = Name,