diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3030b4aeeca33..950125df50ea5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10948,7 +10948,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { * @param propertyName The property name that should be used to query the target for its type */ function pushTypeResolution(target: TypeSystemEntity, propertyName: TypeSystemPropertyName): boolean { - const resolutionCycleStartIndex = findResolutionCycleStartIndex(target, propertyName); + const resolutionCycleStartIndex = findResolutionCycleStartIndex(target, propertyName, resolutionStart); if (resolutionCycleStartIndex >= 0) { // A cycle was found const { length } = resolutionTargets; @@ -10963,8 +10963,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return true; } - function findResolutionCycleStartIndex(target: TypeSystemEntity, propertyName: TypeSystemPropertyName): number { - for (let i = resolutionTargets.length - 1; i >= resolutionStart; i--) { + function isInResolutionStack(target: TypeSystemEntity, propertyName: TypeSystemPropertyName): boolean { + return findResolutionCycleStartIndex(target, propertyName, 0) >= 0; + } + + function findResolutionCycleStartIndex(target: TypeSystemEntity, propertyName: TypeSystemPropertyName, start: number): number { + for (let i = resolutionTargets.length - 1; i >= start; i--) { if (resolutionTargetHasProperty(resolutionTargets[i], resolutionPropertyNames[i])) { return -1; } @@ -15922,7 +15926,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function isResolvingReturnTypeOfSignature(signature: Signature): boolean { return signature.compositeSignatures && some(signature.compositeSignatures, isResolvingReturnTypeOfSignature) || - !signature.resolvedReturnType && findResolutionCycleStartIndex(signature, TypeSystemPropertyName.ResolvedReturnType) >= 0; + !signature.resolvedReturnType && isInResolutionStack(signature, TypeSystemPropertyName.ResolvedReturnType); } function getRestTypeOfSignature(signature: Signature): Type { @@ -20199,7 +20203,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (!type.declaration.nameType) { let constraint; if ( - isArrayType(t) || t.flags & TypeFlags.Any && findResolutionCycleStartIndex(typeVariable!, TypeSystemPropertyName.ImmediateBaseConstraint) < 0 && + isArrayType(t) || t.flags & TypeFlags.Any && !isInResolutionStack(typeVariable!, TypeSystemPropertyName.ImmediateBaseConstraint) && (constraint = getConstraintOfTypeParameter(typeVariable!)) && everyType(constraint, isArrayOrTupleType) ) { return instantiateMappedArrayType(t, type, prependTypeMapping(typeVariable!, t, mapper)); @@ -31497,7 +31501,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function isCircularMappedProperty(symbol: Symbol) { - return !!(getCheckFlags(symbol) & CheckFlags.Mapped && !(symbol as MappedSymbol).links.type && findResolutionCycleStartIndex(symbol, TypeSystemPropertyName.Type) >= 0); + return !!(getCheckFlags(symbol) & CheckFlags.Mapped && !(symbol as MappedSymbol).links.type && isInResolutionStack(symbol, TypeSystemPropertyName.Type)); } function getTypeOfPropertyOfContextualType(type: Type, name: __String, nameType?: Type) {