Improve arity errors for all calls

Not just ones with a single call signature.
This is pretty great!
This commit is contained in:
Nathan Shively-Sanders 2017-05-15 16:22:04 -07:00
parent e5e833e53e
commit 35a9be3b6c

View File

@ -15369,28 +15369,33 @@ namespace ts {
reportNoCommonSupertypeError(inferenceCandidates, (<JsxOpeningLikeElement>node).tagName || (<CallExpression>node).expression || (<TaggedTemplateExpression>node).tag, diagnosticChainHead);
}
}
else if (typeArguments && every(signatures, sig => length(sig.typeParameters) !== typeArguments.length)) {
let min = Number.POSITIVE_INFINITY;
let max = Number.NEGATIVE_INFINITY;
for (const sig of signatures) {
min = Math.min(min, getMinTypeArgumentCount(sig.typeParameters));
max = Math.max(max, length(sig.typeParameters));
}
const paramMessage = max > min ? `${min}-${max}` : min.toString();
reportError(Diagnostics.Expected_0_type_arguments_but_got_1, paramMessage, typeArguments.length.toString());
}
else if (args) {
const argMessage = getSpreadArgumentIndex(args) > -1 ?
"a minimum of " + (args.length - 1) :
args.length.toString();
let min = Number.POSITIVE_INFINITY;
let max = Number.NEGATIVE_INFINITY;
for (const sig of signatures) {
min = Math.min(min, sig.minArgumentCount);
max = Math.max(max, sig.parameters.length);
}
const paramMessage = some(signatures, sig => sig.hasRestParameter) ? "at least " + min :
min < max ? `${min}-${max}` :
min.toString();
reportError(Diagnostics.Expected_0_arguments_but_got_1, paramMessage, argMessage);
}
else {
if (signatures.length === 1) {
if (typeArguments && typeArguments.length !== length(signatures[0].typeParameters)) {
const minTypeArgumentCount = getMinTypeArgumentCount(signatures[0].typeParameters);
const paramMessage = length(signatures[0].typeParameters) > minTypeArgumentCount ?
`${minTypeArgumentCount}-${length(signatures[0].typeParameters)}` :
minTypeArgumentCount.toString();
reportError(Diagnostics.Expected_0_type_arguments_but_got_1, paramMessage, typeArguments.length.toString());
}
else {
const argMessage = getSpreadArgumentIndex(args) > -1 ?
"a minimum of " + (args.length - 1) :
args.length.toString();
const paramMessage = signatures[0].hasRestParameter ? "at least " + signatures[0].minArgumentCount :
signatures[0].minArgumentCount < signatures[0].parameters.length ? `${signatures[0].minArgumentCount}-${signatures[0].parameters.length}` :
signatures[0].minArgumentCount.toString();
reportError(Diagnostics.Expected_0_arguments_but_got_1, paramMessage, argMessage);
}
}
else {
reportError(Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
}
reportError(Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
}
// No signature was applicable. We have already reported the errors for the invalid signature.