From fa6c4b79dd1b6792e2916802b5690a63f57684e5 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Fri, 26 Jan 2018 13:03:17 -0800 Subject: [PATCH] Check for definitely false condition first --- src/compiler/checker.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b9cd77966bc..7851c15779d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8104,6 +8104,11 @@ namespace ts { function getConditionalType(checkType: Type, baseExtendsType: Type, baseTrueType: Type, baseFalseType: Type, inferTypeParameters: TypeParameter[], target: ConditionalType, mapper: TypeMapper, aliasSymbol?: Symbol, baseAliasTypeArguments?: Type[]): Type { // Instantiate extends type without instantiating any 'infer T' type parameters const extendsType = instantiateType(baseExtendsType, mapper); + // Return falseType for a definitely false extends check + if (!isTypeAssignableTo(instantiateType(checkType, anyMapper), instantiateType(extendsType, constraintMapper))) { + return instantiateType(baseFalseType, mapper); + } + // The check could be true for some instantiation let combinedMapper: TypeMapper; if (inferTypeParameters) { const inferences = map(inferTypeParameters, createInferenceInfo); @@ -8125,10 +8130,6 @@ namespace ts { if (isTypeAssignableTo(checkType, inferredExtendsType)) { return instantiateType(baseTrueType, combinedMapper || mapper); } - // Return falseType for a definitely false extends check - if (!isTypeAssignableTo(instantiateType(checkType, anyMapper), instantiateType(extendsType, constraintMapper))) { - return instantiateType(baseFalseType, mapper); - } // Return a deferred type for a check that is neither definitely true nor definitely false const erasedCheckType = getActualTypeParameter(checkType); const trueType = instantiateType(baseTrueType, mapper);