@@ -5636,11 +5636,10 @@ namespace ts {
5636
5636
// M and N (the signatures) are instantiated using type Any as the type argument for all type parameters declared by M and N
5637
5637
source = getErasedSignature(source);
5638
5638
target = getErasedSignature(target);
5639
- let sourceLen = source.parameters.length;
5640
5639
let targetLen = target.parameters.length;
5641
5640
for (let i = 0; i < targetLen; i++) {
5642
- let s = source.hasRestParameter && i === sourceLen - 1 ? getRestTypeOfSignature(source) : getTypeOfSymbol(source.parameters[i]);
5643
- let t = target.hasRestParameter && i === targetLen - 1 ? getRestTypeOfSignature(target) : getTypeOfSymbol(target.parameters[i]);
5641
+ let s = isRestParameterIndex( source, i) ? getRestTypeOfSignature(source) : getTypeOfSymbol(source.parameters[i]);
5642
+ let t = isRestParameterIndex( target, i) ? getRestTypeOfSignature(target) : getTypeOfSymbol(target.parameters[i]);
5644
5643
let related = compareTypes(s, t);
5645
5644
if (!related) {
5646
5645
return Ternary.False;
@@ -5653,6 +5652,10 @@ namespace ts {
5653
5652
return result;
5654
5653
}
5655
5654
5655
+ function isRestParameterIndex(signature: Signature, parameterIndex: number) {
5656
+ return signature.hasRestParameter && parameterIndex >= signature.parameters.length - 1;
5657
+ }
5658
+
5656
5659
function isSupertypeOfEach(candidate: Type, types: Type[]): boolean {
5657
5660
for (let type of types) {
5658
5661
if (candidate !== type && !isTypeSubtypeOf(type, candidate)) return false;
@@ -6814,8 +6817,9 @@ namespace ts {
6814
6817
}
6815
6818
6816
6819
// If last parameter is contextually rest parameter get its type
6817
- if (indexOfParameter === (func.parameters.length - 1) &&
6818
- funcHasRestParameters && contextualSignature.hasRestParameter && func.parameters.length >= contextualSignature.parameters.length) {
6820
+ if (funcHasRestParameters &&
6821
+ indexOfParameter === (func.parameters.length - 1) &&
6822
+ isRestParameterIndex(contextualSignature, func.parameters.length - 1)) {
6819
6823
return getTypeOfSymbol(lastOrUndefined(contextualSignature.parameters));
6820
6824
}
6821
6825
}
@@ -8406,7 +8410,7 @@ namespace ts {
8406
8410
// If spread arguments are present, check that they correspond to a rest parameter. If so, no
8407
8411
// further checking is necessary.
8408
8412
if (spreadArgIndex >= 0) {
8409
- return signature.hasRestParameter && spreadArgIndex >= signature.parameters.length - 1 ;
8413
+ return isRestParameterIndex( signature, spreadArgIndex) ;
8410
8414
}
8411
8415
8412
8416
// Too many arguments implies incorrect arity.
@@ -9397,7 +9401,7 @@ namespace ts {
9397
9401
let contextualParameterType = getTypeAtPosition(context, i);
9398
9402
assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper);
9399
9403
}
9400
- if (signature.hasRestParameter && context.hasRestParameter && signature.parameters.length >= context.parameters.length ) {
9404
+ if (signature.hasRestParameter && isRestParameterIndex( context, signature.parameters.length - 1) ) {
9401
9405
let parameter = lastOrUndefined(signature.parameters);
9402
9406
let contextualParameterType = getTypeOfSymbol(lastOrUndefined(context.parameters));
9403
9407
assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper);
0 commit comments