diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 86acdb7c44b6d..eb3a403d9272c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14565,7 +14565,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function getApparentTypeOfIntersectionType(type: IntersectionType, thisArgument: Type) { - return type.resolvedApparentType || (type.resolvedApparentType = getTypeWithThisArgument(type, thisArgument, /*needApparentType*/ true)); + if (type === thisArgument) { + return type.resolvedApparentType || (type.resolvedApparentType = getTypeWithThisArgument(type, thisArgument, /*needApparentType*/ true)); + } + const key = `I${getTypeId(type)},${getTypeId(thisArgument)}`; + return getCachedType(key) ?? setCachedType(key, getTypeWithThisArgument(type, thisArgument, /*needApparentType*/ true)); } function getResolvedTypeParameterDefault(typeParameter: TypeParameter): Type | undefined { diff --git a/tests/baselines/reference/intersectionApparentTypeCaching.symbols b/tests/baselines/reference/intersectionApparentTypeCaching.symbols new file mode 100644 index 0000000000000..53c9c28862685 --- /dev/null +++ b/tests/baselines/reference/intersectionApparentTypeCaching.symbols @@ -0,0 +1,19 @@ +//// [tests/cases/compiler/intersectionApparentTypeCaching.ts] //// + +=== intersectionApparentTypeCaching.ts === +// https://github.com/microsoft/TypeScript/issues/58175 + +type TX = T["length"]; +>TX : Symbol(TX, Decl(intersectionApparentTypeCaching.ts, 0, 0)) +>T : Symbol(T, Decl(intersectionApparentTypeCaching.ts, 2, 8)) +>T : Symbol(T, Decl(intersectionApparentTypeCaching.ts, 2, 8)) + +type T0 = U; +>T0 : Symbol(T0, Decl(intersectionApparentTypeCaching.ts, 2, 48)) +>U : Symbol(U, Decl(intersectionApparentTypeCaching.ts, 3, 8)) +>U : Symbol(U, Decl(intersectionApparentTypeCaching.ts, 3, 8)) + +type T1 = T0; +>T1 : Symbol(T1, Decl(intersectionApparentTypeCaching.ts, 3, 38)) +>T0 : Symbol(T0, Decl(intersectionApparentTypeCaching.ts, 2, 48)) + diff --git a/tests/baselines/reference/intersectionApparentTypeCaching.types b/tests/baselines/reference/intersectionApparentTypeCaching.types new file mode 100644 index 0000000000000..a8a3b40084689 --- /dev/null +++ b/tests/baselines/reference/intersectionApparentTypeCaching.types @@ -0,0 +1,17 @@ +//// [tests/cases/compiler/intersectionApparentTypeCaching.ts] //// + +=== intersectionApparentTypeCaching.ts === +// https://github.com/microsoft/TypeScript/issues/58175 + +type TX = T["length"]; +>TX : TX +> : ^^^^^ + +type T0 = U; +>T0 : U +> : ^ + +type T1 = T0; +>T1 : string[] +> : ^^^^^^^^ + diff --git a/tests/cases/compiler/intersectionApparentTypeCaching.ts b/tests/cases/compiler/intersectionApparentTypeCaching.ts new file mode 100644 index 0000000000000..1325c4d6f2d7c --- /dev/null +++ b/tests/cases/compiler/intersectionApparentTypeCaching.ts @@ -0,0 +1,8 @@ +// @strict: true +// @noEmit: true + +// https://github.com/microsoft/TypeScript/issues/58175 + +type TX = T["length"]; +type T0 = U; +type T1 = T0;