From 42c0451e792c5273633eca1b6b7bc3e89233d5c2 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 14 Dec 2019 14:55:04 -0800 Subject: [PATCH] (x: number | undefined) -> void is subtype of (x?: number | undefined) => void --- src/compiler/checker.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 40d6deb5ee4..20cdec30cb0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14023,8 +14023,7 @@ namespace ts { } const targetCount = getParameterCount(target); - if (!hasEffectiveRestParameter(target) && - (checkMode & SignatureCheckMode.StrictArity ? getParameterCount(source) : getMinArgumentCount(source)) > targetCount) { + if (!hasEffectiveRestParameter(target) && (checkMode & SignatureCheckMode.StrictArity ? getParameterCount(source) : getMinArgumentCount(source)) > targetCount) { return Ternary.False; } @@ -14084,10 +14083,13 @@ namespace ts { const targetSig = checkMode & SignatureCheckMode.Callback ? undefined : getSingleCallSignature(getNonNullableType(targetType)); const callbacks = sourceSig && targetSig && !getTypePredicateOfSignature(sourceSig) && !getTypePredicateOfSignature(targetSig) && (getFalsyFlags(sourceType) & TypeFlags.Nullable) === (getFalsyFlags(targetType) & TypeFlags.Nullable); - const related = callbacks ? - // TODO: GH#18217 It will work if they're both `undefined`, but not if only one is + let related = callbacks ? compareSignaturesRelated(targetSig!, sourceSig!, (checkMode & SignatureCheckMode.StrictArity) | (strictVariance ? SignatureCheckMode.StrictCallback : SignatureCheckMode.BivariantCallback), reportErrors, errorReporter, incompatibleErrorReporter, compareTypes, reportUnreliableMarkers) : !(checkMode & SignatureCheckMode.Callback) && !strictVariance && compareTypes(sourceType, targetType, /*reportErrors*/ false) || compareTypes(targetType, sourceType, reportErrors); + // With strict arity, (x: number | undefined) => void is a subtype of (x?: number | undefined) => void + if (related && checkMode & SignatureCheckMode.StrictArity && i >= getMinArgumentCount(source) && i < getMinArgumentCount(target) && isTypeIdenticalTo(sourceType, targetType)) { + related = Ternary.False; + } if (!related) { if (reportErrors) { errorReporter!(Diagnostics.Types_of_parameters_0_and_1_are_incompatible,