diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4a18c2e403b..1b0904723df 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6779,8 +6779,19 @@ namespace ts { } function cloneSignature(sig: Signature): Signature { - return createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, /*resolvedReturnType*/ undefined, + const result = createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, /*resolvedReturnType*/ undefined, /*resolvedTypePredicate*/ undefined, sig.minArgumentCount, sig.hasRestParameter, sig.hasLiteralTypes); + result.target = sig.target; + result.mapper = sig.mapper; + return result; + } + + function createUnionSignature(signature: Signature, unionSignatures: Signature[]) { + const result = cloneSignature(signature); + result.unionSignatures = unionSignatures; + result.target = undefined; + result.mapper = undefined; + return result; } function getExpandedParameters(sig: Signature): ReadonlyArray { @@ -6890,9 +6901,8 @@ namespace ts { const thisType = getUnionType(map(unionSignatures, sig => sig.thisParameter ? getTypeOfSymbol(sig.thisParameter) : anyType), UnionReduction.Subtype); thisParameter = createSymbolWithType(signature.thisParameter!, thisType); } - s = cloneSignature(signature); + s = createUnionSignature(signature, unionSignatures); s.thisParameter = thisParameter; - s.unionSignatures = unionSignatures; } (result || (result = [])).push(s); } @@ -8400,8 +8410,6 @@ namespace ts { if (returnSignature) { const newReturnSignature = cloneSignature(returnSignature); newReturnSignature.typeParameters = inferredTypeParameters; - newReturnSignature.target = returnSignature.target; - newReturnSignature.mapper = returnSignature.mapper; const newInstantiatedSignature = cloneSignature(instantiatedSignature); newInstantiatedSignature.resolvedReturnType = getOrCreateTypeFromSignature(newReturnSignature); return newInstantiatedSignature; @@ -18346,14 +18354,8 @@ namespace ts { } } } - // Result is union of signatures collected (return type is union of return types of this signature set) - let result: Signature | undefined; - if (signatureList) { - result = cloneSignature(signatureList[0]); - result.unionSignatures = signatureList; - } - return result; + return signatureList && createUnionSignature(signatureList[0], signatureList); } function checkSpreadExpression(node: SpreadElement, checkMode?: CheckMode): Type {