mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-19 10:41:56 -05:00
fix error when use spread arguments twice
This commit is contained in:
@@ -25063,10 +25063,18 @@ namespace ts {
|
||||
// If we are missing the close parenthesis, the call is incomplete.
|
||||
callIsIncomplete = node.arguments.end === node.end;
|
||||
|
||||
// If a spread argument is present, check that it corresponds to a rest parameter or at least that it's in the valid range.
|
||||
const spreadArgIndex = getSpreadArgumentIndex(args);
|
||||
if (spreadArgIndex >= 0) {
|
||||
return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature));
|
||||
// If one or more spread arguments are present, check that they correspond to a rest parameter or at least that they are in the valid range.
|
||||
const firstSpreadArgIndex = getSpreadArgumentIndex(args);
|
||||
if (firstSpreadArgIndex >= 0) {
|
||||
if (firstSpreadArgIndex === args.length - 1) {
|
||||
return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature));
|
||||
}
|
||||
|
||||
let totalCount = countSpreadArgumentLength(<SpreadElement>args[firstSpreadArgIndex]);
|
||||
for (let i = firstSpreadArgIndex; i < args.length; i++) {
|
||||
totalCount += isSpreadArgument(args[i]) ? countSpreadArgumentLength(<SpreadElement>args[i]) : 1;
|
||||
}
|
||||
return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount < getParameterCount(signature));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25089,6 +25097,11 @@ namespace ts {
|
||||
return true;
|
||||
}
|
||||
|
||||
function countSpreadArgumentLength(argment: SpreadElement): number {
|
||||
const type = flowLoopCount ? checkExpression(argment.expression) : checkExpressionCached(argment.expression);
|
||||
return isTupleType(type) ? getTypeArguments(type).length : 1;
|
||||
}
|
||||
|
||||
function hasCorrectTypeArgumentArity(signature: Signature, typeArguments: NodeArray<TypeNode> | undefined) {
|
||||
// If the user supplied type arguments, but the number of type arguments does not match
|
||||
// the declared number of type parameters, the call has an incorrect arity.
|
||||
@@ -25544,7 +25557,7 @@ namespace ts {
|
||||
const spreadArgument = <SpreadElement>args[length - 1];
|
||||
const type = flowLoopCount ? checkExpression(spreadArgument.expression) : checkExpressionCached(spreadArgument.expression);
|
||||
if (isTupleType(type)) {
|
||||
const typeArguments = getTypeArguments(<TypeReference>type);
|
||||
const typeArguments = getTypeArguments(type);
|
||||
const restIndex = type.target.hasRestElement ? typeArguments.length - 1 : -1;
|
||||
const syntheticArgs = map(typeArguments, (t, i) => createSyntheticExpression(spreadArgument, t, /*isSpread*/ i === restIndex, type.target.labeledElementDeclarations?.[i]));
|
||||
return concatenate(args.slice(0, length - 1), syntheticArgs);
|
||||
|
||||
Reference in New Issue
Block a user