Skip to content

Commit cc9e9ec

Browse files
committed
Fix signature cloning to ensure target and mapper are propagated
1 parent 97fbc87 commit cc9e9ec

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

src/compiler/checker.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6778,8 +6778,19 @@ namespace ts {
67786778
}
67796779

67806780
function cloneSignature(sig: Signature): Signature {
6781-
return createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, /*resolvedReturnType*/ undefined,
6781+
const result = createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, /*resolvedReturnType*/ undefined,
67826782
/*resolvedTypePredicate*/ undefined, sig.minArgumentCount, sig.hasRestParameter, sig.hasLiteralTypes);
6783+
result.target = sig.target;
6784+
result.mapper = sig.mapper;
6785+
return result;
6786+
}
6787+
6788+
function createUnionSignature(signature: Signature, unionSignatures: Signature[]) {
6789+
const result = cloneSignature(signature);
6790+
result.unionSignatures = unionSignatures;
6791+
result.target = undefined;
6792+
result.mapper = undefined;
6793+
return result;
67836794
}
67846795

67856796
function getExpandedParameters(sig: Signature): ReadonlyArray<Symbol> {
@@ -6889,9 +6900,8 @@ namespace ts {
68896900
const thisType = getUnionType(map(unionSignatures, sig => sig.thisParameter ? getTypeOfSymbol(sig.thisParameter) : anyType), UnionReduction.Subtype);
68906901
thisParameter = createSymbolWithType(signature.thisParameter!, thisType);
68916902
}
6892-
s = cloneSignature(signature);
6903+
s = createUnionSignature(signature, unionSignatures);
68936904
s.thisParameter = thisParameter;
6894-
s.unionSignatures = unionSignatures;
68956905
}
68966906
(result || (result = [])).push(s);
68976907
}
@@ -8399,8 +8409,6 @@ namespace ts {
83998409
if (returnSignature) {
84008410
const newReturnSignature = cloneSignature(returnSignature);
84018411
newReturnSignature.typeParameters = inferredTypeParameters;
8402-
newReturnSignature.target = returnSignature.target;
8403-
newReturnSignature.mapper = returnSignature.mapper;
84048412
const newInstantiatedSignature = cloneSignature(instantiatedSignature);
84058413
newInstantiatedSignature.resolvedReturnType = getOrCreateTypeFromSignature(newReturnSignature);
84068414
return newInstantiatedSignature;
@@ -18345,14 +18353,8 @@ namespace ts {
1834518353
}
1834618354
}
1834718355
}
18348-
1834918356
// Result is union of signatures collected (return type is union of return types of this signature set)
18350-
let result: Signature | undefined;
18351-
if (signatureList) {
18352-
result = cloneSignature(signatureList[0]);
18353-
result.unionSignatures = signatureList;
18354-
}
18355-
return result;
18357+
return signatureList && createUnionSignature(signatureList[0], signatureList);
1835618358
}
1835718359

1835818360
function checkSpreadExpression(node: SpreadElement, checkMode?: CheckMode): Type {

0 commit comments

Comments
 (0)