@@ -5620,11 +5620,10 @@ namespace ts {
5620
5620
// M and N (the signatures) are instantiated using type Any as the type argument for all type parameters declared by M and N
5621
5621
source = getErasedSignature(source);
5622
5622
target = getErasedSignature(target);
5623
- let sourceLen = source.parameters.length;
5624
5623
let targetLen = target.parameters.length;
5625
5624
for (let i = 0; i < targetLen; i++) {
5626
- let s = source.hasRestParameter && i === sourceLen - 1 ? getRestTypeOfSignature(source) : getTypeOfSymbol(source.parameters[i]);
5627
- let t = target.hasRestParameter && i === targetLen - 1 ? getRestTypeOfSignature(target) : getTypeOfSymbol(target.parameters[i]);
5625
+ let s = isRestParameterIndex( source, i) ? getRestTypeOfSignature(source) : getTypeOfSymbol(source.parameters[i]);
5626
+ let t = isRestParameterIndex( target, i) ? getRestTypeOfSignature(target) : getTypeOfSymbol(target.parameters[i]);
5628
5627
let related = compareTypes(s, t);
5629
5628
if (!related) {
5630
5629
return Ternary.False;
@@ -5637,6 +5636,10 @@ namespace ts {
5637
5636
return result;
5638
5637
}
5639
5638
5639
+ function isRestParameterIndex(signature: Signature, parameterIndex: number) {
5640
+ return signature.hasRestParameter && parameterIndex >= signature.parameters.length - 1;
5641
+ }
5642
+
5640
5643
function isSupertypeOfEach(candidate: Type, types: Type[]): boolean {
5641
5644
for (let type of types) {
5642
5645
if (candidate !== type && !isTypeSubtypeOf(type, candidate)) return false;
@@ -6798,8 +6801,9 @@ namespace ts {
6798
6801
}
6799
6802
6800
6803
// If last parameter is contextually rest parameter get its type
6801
- if (indexOfParameter === (func.parameters.length - 1) &&
6802
- funcHasRestParameters && contextualSignature.hasRestParameter && func.parameters.length >= contextualSignature.parameters.length) {
6804
+ if (funcHasRestParameters &&
6805
+ indexOfParameter === (func.parameters.length - 1) &&
6806
+ isRestParameterIndex(contextualSignature, func.parameters.length - 1)) {
6803
6807
return getTypeOfSymbol(lastOrUndefined(contextualSignature.parameters));
6804
6808
}
6805
6809
}
@@ -8390,7 +8394,7 @@ namespace ts {
8390
8394
// If spread arguments are present, check that they correspond to a rest parameter. If so, no
8391
8395
// further checking is necessary.
8392
8396
if (spreadArgIndex >= 0) {
8393
- return signature.hasRestParameter && spreadArgIndex >= signature.parameters.length - 1 ;
8397
+ return isRestParameterIndex( signature, spreadArgIndex) ;
8394
8398
}
8395
8399
8396
8400
// Too many arguments implies incorrect arity.
@@ -9381,7 +9385,7 @@ namespace ts {
9381
9385
let contextualParameterType = getTypeAtPosition(context, i);
9382
9386
assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper);
9383
9387
}
9384
- if (signature.hasRestParameter && context.hasRestParameter && signature.parameters.length >= context.parameters.length ) {
9388
+ if (signature.hasRestParameter && isRestParameterIndex( context, signature.parameters.length - 1) ) {
9385
9389
let parameter = lastOrUndefined(signature.parameters);
9386
9390
let contextualParameterType = getTypeOfSymbol(lastOrUndefined(context.parameters));
9387
9391
assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper);
0 commit comments