Skip to content

Commit d08ae97

Browse files
committed
Conditionally elide a parameter from contextual type signature calculation
1 parent 75f88ee commit d08ae97

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

src/compiler/checker.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -21340,8 +21340,23 @@ namespace ts {
2134021340
// If we're already in the process of resolving the given signature, don't resolve again as
2134121341
// that could cause infinite recursion. Instead, return anySignature.
2134221342
let signature = getNodeLinks(callTarget).resolvedSignature === resolvingSignature ? resolvingSignature : getResolvedSignature(callTarget);
21343-
if (contextFlags && contextFlags & ContextFlags.BaseConstraint && signature.target && !hasTypeArguments(callTarget)) {
21344-
signature = getBaseSignature(signature.target);
21343+
if (contextFlags && contextFlags & ContextFlags.BaseConstraint && signature !== resolvingSignature && !hasTypeArguments(callTarget)) {
21344+
if (isCallOrNewExpression(callTarget) && callTarget.arguments) {
21345+
let clone = signature.omittedParameterCache && signature.omittedParameterCache[argIndex];
21346+
if (!clone) {
21347+
// clone the ast, eliding the target argument
21348+
clone = getSynthesizedClone(callTarget) as CallExpression | NewExpression;
21349+
(clone as any).id = undefined;
21350+
clone.arguments = createNodeArray([...clone.arguments!.slice(0, argIndex), createOmittedExpression(), ...clone.arguments!.slice(argIndex + 1)]);
21351+
clone.arguments![argIndex].parent = clone;
21352+
clone.parent = callTarget.parent;
21353+
(signature.omittedParameterCache || (signature.omittedParameterCache = []))[argIndex] = clone;
21354+
}
21355+
signature = getResolvedSignature(clone);
21356+
}
21357+
else if (signature.target) {
21358+
signature = getBaseSignature(signature.target);
21359+
}
2134521360
}
2134621361

2134721362
if (isJsxOpeningLikeElement(callTarget) && argIndex === 0) {

src/compiler/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -4789,6 +4789,8 @@ namespace ts {
47894789
isolatedSignatureType?: ObjectType; // A manufactured type that just contains the signature for purposes of signature comparison
47904790
/* @internal */
47914791
instantiations?: Map<Signature>; // Generic signature instantiation cache
4792+
/* @internal */
4793+
omittedParameterCache?: CallLikeExpression[];
47924794
}
47934795

47944796
export const enum IndexKind {

0 commit comments

Comments
 (0)