diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c3375bb6536..d97abd4a5d0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -23456,8 +23456,9 @@ namespace ts { let newTypeParameters: TypeParameter[] | undefined; for (const tp of typeParameters) { const name = tp.symbol.escapedName; - if (hasInferredTypeParameterByName(context, name)) { - const symbol = createSymbol(SymbolFlags.TypeParameter, getUniqueInferredTypeParameterName(context, name)); + if (hasTypeParameterByName(context.inferredTypeParameters, name) || hasTypeParameterByName(result, name)) { + const newName = getUniqueTypeParameterName(concatenate(context.inferredTypeParameters, result), name); + const symbol = createSymbol(SymbolFlags.TypeParameter, newName); const newTypeParameter = createTypeParameter(symbol); newTypeParameter.target = tp; oldTypeParameters = append(oldTypeParameters, tp); @@ -23477,15 +23478,17 @@ namespace ts { return result; } - function hasInferredTypeParameterByName(context: InferenceContext, name: __String) { - return some(context.inferredTypeParameters, tp => tp.symbol.escapedName === name); + function hasTypeParameterByName(typeParameters: ReadonlyArray | undefined, name: __String) { + return some(typeParameters, tp => tp.symbol.escapedName === name); } - function getUniqueInferredTypeParameterName(context: InferenceContext, baseName: __String) { - let index = 1; - while (true) { - const augmentedName = <__String>(baseName + index); - if (!hasInferredTypeParameterByName(context, augmentedName)) { + function getUniqueTypeParameterName(typeParameters: ReadonlyArray, baseName: __String) { + let len = (baseName).length; + while (len > 1 && (baseName).charCodeAt(len - 1) >= CharacterCodes._0 && (baseName).charCodeAt(len - 1) <= CharacterCodes._9) len--; + const s = (baseName).slice(0, len); + for (let index = 1; true; index++) { + const augmentedName = <__String>(s + index); + if (!hasTypeParameterByName(typeParameters, augmentedName)) { return augmentedName; } }