@@ -8157,7 +8157,8 @@ namespace ts {
8157
8157
function isSignatureAssignableTo(source: Signature,
8158
8158
target: Signature,
8159
8159
ignoreReturnTypes: boolean): boolean {
8160
- return compareSignaturesRelated(source, target, ignoreReturnTypes, /*reportErrors*/ false, /*errorReporter*/ undefined, compareTypesAssignable) !== Ternary.False;
8160
+ return compareSignaturesRelated(source, target, /*strictVariance*/ false, ignoreReturnTypes, /*reportErrors*/ false,
8161
+ /*errorReporter*/ undefined, compareTypesAssignable) !== Ternary.False;
8161
8162
}
8162
8163
8163
8164
type ErrorReporter = (message: DiagnosticMessage, arg0?: string, arg1?: string) => void;
@@ -8167,6 +8168,7 @@ namespace ts {
8167
8168
*/
8168
8169
function compareSignaturesRelated(source: Signature,
8169
8170
target: Signature,
8171
+ strictVariance: boolean,
8170
8172
ignoreReturnTypes: boolean,
8171
8173
reportErrors: boolean,
8172
8174
errorReporter: ErrorReporter,
@@ -8209,9 +8211,17 @@ namespace ts {
8209
8211
const sourceParams = source.parameters;
8210
8212
const targetParams = target.parameters;
8211
8213
for (let i = 0; i < checkCount; i++) {
8212
- const s = i < sourceMax ? getTypeOfParameter(sourceParams[i]) : getRestTypeOfSignature(source);
8213
- const t = i < targetMax ? getTypeOfParameter(targetParams[i]) : getRestTypeOfSignature(target);
8214
- const related = compareTypes(s, t, /*reportErrors*/ false) || compareTypes(t, s, reportErrors);
8214
+ const sourceType = i < sourceMax ? getTypeOfParameter(sourceParams[i]) : getRestTypeOfSignature(source);
8215
+ const targetType = i < targetMax ? getTypeOfParameter(targetParams[i]) : getRestTypeOfSignature(target);
8216
+ const sourceSig = getSingleCallSignature(sourceType);
8217
+ const targetSig = getSingleCallSignature(targetType);
8218
+ // If the source and target parameters both have function types with a single call signature we are
8219
+ // relating two callback parameters. In that case we compare the callback signatures with strict
8220
+ // variance, meaning we require the callback parameters to be pairwise co-variant (because, similar
8221
+ // to return values, callback parameters are output positions).
8222
+ const related = sourceSig && targetSig ?
8223
+ compareSignaturesRelated(targetSig, sourceSig, /*strictVariance*/ true, /*ignoreReturnTypes*/ false, reportErrors, errorReporter, compareTypes) :
8224
+ !strictVariance && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors);
8215
8225
if (!related) {
8216
8226
if (reportErrors) {
8217
8227
errorReporter(Diagnostics.Types_of_parameters_0_and_1_are_incompatible,
@@ -9210,7 +9220,7 @@ namespace ts {
9210
9220
* See signatureAssignableTo, compareSignaturesIdentical
9211
9221
*/
9212
9222
function signatureRelatedTo(source: Signature, target: Signature, reportErrors: boolean): Ternary {
9213
- return compareSignaturesRelated(source, target, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo);
9223
+ return compareSignaturesRelated(source, target, /*strictVariance*/ false, /* ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo);
9214
9224
}
9215
9225
9216
9226
function signaturesIdenticalTo(source: Type, target: Type, kind: SignatureKind): Ternary {
0 commit comments