@@ -10058,6 +10058,13 @@ namespace ts {
10058
10058
return type.flags & TypeFlags.Substitution ? (<SubstitutionType>type).typeVariable : type;
10059
10059
}
10060
10060
10061
+ /**
10062
+ * Invokes union simplification logic to determine if an intersection is considered empty as a union constituent
10063
+ */
10064
+ function isIntersectionEmpty(type1: Type, type2: Type) {
10065
+ return !!(getUnionType([intersectTypes(type1, type2), neverType]).flags & TypeFlags.Never);
10066
+ }
10067
+
10061
10068
function getConditionalType(root: ConditionalRoot, mapper: TypeMapper | undefined): Type {
10062
10069
const checkType = instantiateType(root.checkType, mapper);
10063
10070
const extendsType = instantiateType(root.extendsType, mapper);
@@ -10076,15 +10083,15 @@ namespace ts {
10076
10083
if (checkType.flags & TypeFlags.Any || isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(extendsType))) { // Always true
10077
10084
result = getDefaultConstraintOfTrueBranchOfConditionalType(root, /*combinedMapper*/ undefined, mapper);
10078
10085
}
10079
- else if (getUnionType([getIntersectionType([ checkType, extendsType]), neverType]).flags & TypeFlags.Never ) { // Always false
10086
+ else if (isIntersectionEmpty( checkType, extendsType) ) { // Always false
10080
10087
result = neverType;
10081
10088
}
10082
10089
}
10083
10090
else if (trueType.flags & TypeFlags.Never && isTypeIdenticalTo(getActualTypeVariable(falseType), getActualTypeVariable(checkType))) {
10084
10091
if (!(checkType.flags & TypeFlags.Any) && isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(extendsType))) { // Always true
10085
10092
result = neverType;
10086
10093
}
10087
- else if (checkType.flags & TypeFlags.Any || getUnionType([getIntersectionType([ checkType, extendsType]), neverType]).flags & TypeFlags.Never ) { // Always false
10094
+ else if (checkType.flags & TypeFlags.Any || isIntersectionEmpty( checkType, extendsType) ) { // Always false
10088
10095
result = falseType; // TODO: Intersect negated `extends` type here
10089
10096
}
10090
10097
}
0 commit comments