@@ -24266,14 +24266,17 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions
2426624266
2426724267 const targetIncludesParamSpec = reverseMatching ? !!srcType.details.paramSpec : !!destType.details.paramSpec;
2426824268
24269- const destPositionalCount =
24270- destParamDetails.argsIndex ?? destParamDetails.firstKeywordOnlyIndex ?? destParamDetails.params.length;
24271- const srcPositionalCount =
24272- srcParamDetails.argsIndex ?? srcParamDetails.firstKeywordOnlyIndex ?? srcParamDetails.params.length;
24269+ const destPositionalCount = destParamDetails.firstKeywordOnlyIndex ?? destParamDetails.params.length;
24270+ const srcPositionalCount = srcParamDetails.firstKeywordOnlyIndex ?? srcParamDetails.params.length;
2427324271 const positionalsToMatch = Math.min(destPositionalCount, srcPositionalCount);
2427424272
2427524273 // Match positional parameters.
2427624274 for (let paramIndex = 0; paramIndex < positionalsToMatch; paramIndex++) {
24275+ // Skip over the *args parameter since it's handled separately below.
24276+ if (paramIndex === destParamDetails.argsIndex) {
24277+ continue;
24278+ }
24279+
2427724280 const destParam = destParamDetails.params[paramIndex];
2427824281 const srcParam = srcParamDetails.params[paramIndex];
2427924282
@@ -24302,7 +24305,11 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions
2430224305 }
2430324306 }
2430424307
24305- if (!!destParam.param.hasDefault && !srcParam.param.hasDefault) {
24308+ if (
24309+ !!destParam.param.hasDefault &&
24310+ !srcParam.param.hasDefault &&
24311+ paramIndex !== srcParamDetails.argsIndex
24312+ ) {
2430624313 diag?.createAddendum().addMessage(
2430724314 Localizer.DiagnosticAddendum.functionParamDefaultMissing().format({
2430824315 name: srcParamName,
@@ -24417,6 +24424,10 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions
2441724424 // *args parameter type.
2441824425 const srcArgsType = srcParamDetails.params[srcParamDetails.argsIndex].type;
2441924426 for (let paramIndex = srcPositionalCount; paramIndex < destPositionalCount; paramIndex++) {
24427+ if (paramIndex === srcParamDetails.argsIndex) {
24428+ continue;
24429+ }
24430+
2442024431 const destParamType = destParamDetails.params[paramIndex].type;
2442124432 if (isVariadicTypeVar(destParamType) && !isVariadicTypeVar(srcArgsType)) {
2442224433 diag?.addMessage(Localizer.DiagnosticAddendum.typeVarTupleRequiresKnownLength());
@@ -24451,13 +24462,22 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions
2445124462 }
2445224463 }
2445324464 } else if (!srcParamDetails.paramSpec) {
24454- diag?.addMessage(
24455- Localizer.DiagnosticAddendum.functionTooManyParams().format({
24456- expected: srcPositionalCount,
24457- received: destPositionalCount,
24458- })
24459- );
24460- canAssign = false;
24465+ // If the dest contains a *args, remove it from the positional count
24466+ // because it's OK for zero source args to match it.
24467+ let adjDestPositionalCount = destPositionalCount;
24468+ if (destParamDetails.argsIndex !== undefined && destParamDetails.argsIndex < destPositionalCount) {
24469+ adjDestPositionalCount--;
24470+ }
24471+
24472+ if (srcPositionalCount < adjDestPositionalCount) {
24473+ diag?.addMessage(
24474+ Localizer.DiagnosticAddendum.functionTooManyParams().format({
24475+ expected: srcPositionalCount,
24476+ received: destPositionalCount,
24477+ })
24478+ );
24479+ canAssign = false;
24480+ }
2446124481 }
2446224482 }
2446324483
0 commit comments