@@ -16186,38 +16186,36 @@ namespace ts {
16186
16186
const restIndex = sourceRestType || targetRestType ? paramCount - 1 : -1;
16187
16187
16188
16188
for (let i = 0; i < paramCount; i++) {
16189
- const sourceType = i === restIndex ? getRestTypeAtPosition(source, i) : tryGetTypeAtPosition(source, i);
16190
- const targetType = i === restIndex ? getRestTypeAtPosition(target, i) : tryGetTypeAtPosition(target, i);
16191
- if (sourceType && targetType) {
16192
- // In order to ensure that any generic type Foo<T> is at least co-variant with respect to T no matter
16193
- // how Foo uses T, we need to relate parameters bi-variantly (given that parameters are input positions,
16194
- // they naturally relate only contra-variantly). However, if the source and target parameters both have
16195
- // function types with a single call signature, we know we are relating two callback parameters. In
16196
- // that case it is sufficient to only relate the parameters of the signatures co-variantly because,
16197
- // similar to return values, callback parameters are output positions. This means that a Promise<T>,
16198
- // where T is used only in callback parameter positions, will be co-variant (as opposed to bi-variant)
16199
- // with respect to T.
16200
- const sourceSig = checkMode & SignatureCheckMode.Callback ? undefined : getSingleCallSignature(getNonNullableType(sourceType));
16201
- const targetSig = checkMode & SignatureCheckMode.Callback ? undefined : getSingleCallSignature(getNonNullableType(targetType));
16202
- const callbacks = sourceSig && targetSig && !getTypePredicateOfSignature(sourceSig) && !getTypePredicateOfSignature(targetSig) &&
16203
- (getFalsyFlags(sourceType) & TypeFlags.Nullable) === (getFalsyFlags(targetType) & TypeFlags.Nullable);
16204
- let related = callbacks ?
16205
- compareSignaturesRelated(targetSig!, sourceSig!, (checkMode & SignatureCheckMode.StrictArity) | (strictVariance ? SignatureCheckMode.StrictCallback : SignatureCheckMode.BivariantCallback), reportErrors, errorReporter, incompatibleErrorReporter, compareTypes, reportUnreliableMarkers) :
16206
- !(checkMode & SignatureCheckMode.Callback) && !strictVariance && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors);
16207
- // With strict arity, (x: number | undefined) => void is a subtype of (x?: number | undefined) => void
16208
- if (related && checkMode & SignatureCheckMode.StrictArity && i >= getMinArgumentCount(source) && i < getMinArgumentCount(target) && compareTypes(sourceType, targetType, /*reportErrors*/ false)) {
16209
- related = Ternary.False;
16210
- }
16211
- if (!related) {
16212
- if (reportErrors) {
16213
- errorReporter!(Diagnostics.Types_of_parameters_0_and_1_are_incompatible,
16214
- unescapeLeadingUnderscores(getParameterNameAtPosition(source, i)),
16215
- unescapeLeadingUnderscores(getParameterNameAtPosition(target, i)));
16216
- }
16217
- return Ternary.False;
16189
+ const sourceType = i === restIndex ? getRestTypeAtPosition(source, i) : getTypeAtPosition(source, i);
16190
+ const targetType = i === restIndex ? getRestTypeAtPosition(target, i) : getTypeAtPosition(target, i);
16191
+ // In order to ensure that any generic type Foo<T> is at least co-variant with respect to T no matter
16192
+ // how Foo uses T, we need to relate parameters bi-variantly (given that parameters are input positions,
16193
+ // they naturally relate only contra-variantly). However, if the source and target parameters both have
16194
+ // function types with a single call signature, we know we are relating two callback parameters. In
16195
+ // that case it is sufficient to only relate the parameters of the signatures co-variantly because,
16196
+ // similar to return values, callback parameters are output positions. This means that a Promise<T>,
16197
+ // where T is used only in callback parameter positions, will be co-variant (as opposed to bi-variant)
16198
+ // with respect to T.
16199
+ const sourceSig = checkMode & SignatureCheckMode.Callback ? undefined : getSingleCallSignature(getNonNullableType(sourceType));
16200
+ const targetSig = checkMode & SignatureCheckMode.Callback ? undefined : getSingleCallSignature(getNonNullableType(targetType));
16201
+ const callbacks = sourceSig && targetSig && !getTypePredicateOfSignature(sourceSig) && !getTypePredicateOfSignature(targetSig) &&
16202
+ (getFalsyFlags(sourceType) & TypeFlags.Nullable) === (getFalsyFlags(targetType) & TypeFlags.Nullable);
16203
+ let related = callbacks ?
16204
+ compareSignaturesRelated(targetSig!, sourceSig!, (checkMode & SignatureCheckMode.StrictArity) | (strictVariance ? SignatureCheckMode.StrictCallback : SignatureCheckMode.BivariantCallback), reportErrors, errorReporter, incompatibleErrorReporter, compareTypes, reportUnreliableMarkers) :
16205
+ !(checkMode & SignatureCheckMode.Callback) && !strictVariance && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors);
16206
+ // With strict arity, (x: number | undefined) => void is a subtype of (x?: number | undefined) => void
16207
+ if (related && checkMode & SignatureCheckMode.StrictArity && i >= getMinArgumentCount(source) && i < getMinArgumentCount(target) && compareTypes(sourceType, targetType, /*reportErrors*/ false)) {
16208
+ related = Ternary.False;
16209
+ }
16210
+ if (!related) {
16211
+ if (reportErrors) {
16212
+ errorReporter!(Diagnostics.Types_of_parameters_0_and_1_are_incompatible,
16213
+ unescapeLeadingUnderscores(getParameterNameAtPosition(source, i)),
16214
+ unescapeLeadingUnderscores(getParameterNameAtPosition(target, i)));
16218
16215
}
16219
- result &= related ;
16216
+ return Ternary.False ;
16220
16217
}
16218
+ result &= related;
16221
16219
}
16222
16220
16223
16221
if (!(checkMode & SignatureCheckMode.IgnoreReturnTypes)) {
0 commit comments