diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 67e3eb1f9a2..7dddeaac507 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -16604,7 +16604,8 @@ namespace ts { if (t.flags & (TypeFlags.AnyOrUnknown | TypeFlags.InstantiableNonPrimitive | TypeFlags.Object | TypeFlags.Intersection) && t !== wildcardType && !isErrorType(t)) { if (!type.declaration.nameType) { let constraint; - if (isArrayType(t) || (t.flags & TypeFlags.Any) && (constraint = getConstraintOfTypeParameter(typeVariable)) && everyType(constraint, or(isArrayType, isTupleType))) { + if (isArrayType(t) || t.flags & TypeFlags.Any && findResolutionCycleStartIndex(typeVariable, TypeSystemPropertyName.ImmediateBaseConstraint) < 0 && + (constraint = getConstraintOfTypeParameter(typeVariable)) && everyType(constraint, or(isArrayType, isTupleType))) { return instantiateMappedArrayType(t, type, prependTypeMapping(typeVariable, t, mapper)); } if (isGenericTupleType(t)) { diff --git a/tests/baselines/reference/mappedTypeWithAny.errors.txt b/tests/baselines/reference/mappedTypeWithAny.errors.txt index 77a1e3e81a1..f049f7e3ed0 100644 --- a/tests/baselines/reference/mappedTypeWithAny.errors.txt +++ b/tests/baselines/reference/mappedTypeWithAny.errors.txt @@ -67,4 +67,14 @@ tests/cases/conformance/types/mapped/mappedTypeWithAny.ts(53,5): error TS2322: T let def: [any, any] = stringifyPair(void 0 as any); ~~~ !!! error TS2322: Type 'string[]' is not assignable to type '[any, any]'. -!!! error TS2322: Target requires 2 element(s) but source may have fewer. \ No newline at end of file +!!! error TS2322: Target requires 2 element(s) but source may have fewer. + + // Repro from #46582 + + type Evolvable = { + [P in keyof E]: never; + }; + type Evolver = any> = { + [key in keyof Partial]: never; + }; + \ No newline at end of file diff --git a/tests/baselines/reference/mappedTypeWithAny.js b/tests/baselines/reference/mappedTypeWithAny.js index a36e8fa3cd9..9c402e50944 100644 --- a/tests/baselines/reference/mappedTypeWithAny.js +++ b/tests/baselines/reference/mappedTypeWithAny.js @@ -51,7 +51,17 @@ declare function stringifyArray(arr: T): { -readonly [ let abc: any[] = stringifyArray(void 0 as any); declare function stringifyPair(arr: T): { -readonly [K in keyof T]: string }; -let def: [any, any] = stringifyPair(void 0 as any); +let def: [any, any] = stringifyPair(void 0 as any); + +// Repro from #46582 + +type Evolvable = { + [P in keyof E]: never; +}; +type Evolver = any> = { + [key in keyof Partial]: never; +}; + //// [mappedTypeWithAny.js] "use strict"; @@ -110,3 +120,9 @@ declare function stringifyPair(arr: T): { -readonly [K in keyof T]: string; }; declare let def: [any, any]; +declare type Evolvable = { + [P in keyof E]: never; +}; +declare type Evolver = any> = { + [key in keyof Partial]: never; +}; diff --git a/tests/baselines/reference/mappedTypeWithAny.symbols b/tests/baselines/reference/mappedTypeWithAny.symbols index 6b411af1f45..b3a5fe6b0e1 100644 --- a/tests/baselines/reference/mappedTypeWithAny.symbols +++ b/tests/baselines/reference/mappedTypeWithAny.symbols @@ -151,3 +151,27 @@ let def: [any, any] = stringifyPair(void 0 as any); >def : Symbol(def, Decl(mappedTypeWithAny.ts, 52, 3)) >stringifyPair : Symbol(stringifyPair, Decl(mappedTypeWithAny.ts, 49, 47)) +// Repro from #46582 + +type Evolvable = { +>Evolvable : Symbol(Evolvable, Decl(mappedTypeWithAny.ts, 52, 51)) +>E : Symbol(E, Decl(mappedTypeWithAny.ts, 56, 15)) +>Evolver : Symbol(Evolver, Decl(mappedTypeWithAny.ts, 58, 2)) + + [P in keyof E]: never; +>P : Symbol(P, Decl(mappedTypeWithAny.ts, 57, 3)) +>E : Symbol(E, Decl(mappedTypeWithAny.ts, 56, 15)) + +}; +type Evolver = any> = { +>Evolver : Symbol(Evolver, Decl(mappedTypeWithAny.ts, 58, 2)) +>T : Symbol(T, Decl(mappedTypeWithAny.ts, 59, 13)) +>Evolvable : Symbol(Evolvable, Decl(mappedTypeWithAny.ts, 52, 51)) + + [key in keyof Partial]: never; +>key : Symbol(key, Decl(mappedTypeWithAny.ts, 60, 3)) +>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(mappedTypeWithAny.ts, 59, 13)) + +}; + diff --git a/tests/baselines/reference/mappedTypeWithAny.types b/tests/baselines/reference/mappedTypeWithAny.types index f8eb3abf087..773984fa576 100644 --- a/tests/baselines/reference/mappedTypeWithAny.types +++ b/tests/baselines/reference/mappedTypeWithAny.types @@ -125,3 +125,16 @@ let def: [any, any] = stringifyPair(void 0 as any); >void 0 : undefined >0 : 0 +// Repro from #46582 + +type Evolvable = { +>Evolvable : Evolvable + + [P in keyof E]: never; +}; +type Evolver = any> = { +>Evolver : Evolver + + [key in keyof Partial]: never; +}; + diff --git a/tests/cases/conformance/types/mapped/mappedTypeWithAny.ts b/tests/cases/conformance/types/mapped/mappedTypeWithAny.ts index 41eaa5945c9..89c28ddafc6 100644 --- a/tests/cases/conformance/types/mapped/mappedTypeWithAny.ts +++ b/tests/cases/conformance/types/mapped/mappedTypeWithAny.ts @@ -53,4 +53,13 @@ declare function stringifyArray(arr: T): { -readonly [ let abc: any[] = stringifyArray(void 0 as any); declare function stringifyPair(arr: T): { -readonly [K in keyof T]: string }; -let def: [any, any] = stringifyPair(void 0 as any); \ No newline at end of file +let def: [any, any] = stringifyPair(void 0 as any); + +// Repro from #46582 + +type Evolvable = { + [P in keyof E]: never; +}; +type Evolver = any> = { + [key in keyof Partial]: never; +};