Skip to content

Commit ca93b24

Browse files
Revert "Don't relate unmatched parameter positions in signatures (#41308)"
This reverts commit bd27bd8.
1 parent 6369d89 commit ca93b24

File tree

5 files changed

+28
-82
lines changed

5 files changed

+28
-82
lines changed

Diff for: src/compiler/checker.ts

+28-30
Original file line numberDiff line numberDiff line change
@@ -16186,38 +16186,36 @@ namespace ts {
1618616186
const restIndex = sourceRestType || targetRestType ? paramCount - 1 : -1;
1618716187

1618816188
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)));
1621816215
}
16219-
result &= related;
16216+
return Ternary.False;
1622016217
}
16218+
result &= related;
1622116219
}
1622216220

1622316221
if (!(checkMode & SignatureCheckMode.IgnoreReturnTypes)) {

Diff for: tests/baselines/reference/unmatchedParameterPositions.js

-13
This file was deleted.

Diff for: tests/baselines/reference/unmatchedParameterPositions.symbols

-16
This file was deleted.

Diff for: tests/baselines/reference/unmatchedParameterPositions.types

-16
This file was deleted.

Diff for: tests/cases/compiler/unmatchedParameterPositions.ts

-7
This file was deleted.

0 commit comments

Comments
 (0)