@@ -6233,7 +6233,7 @@ namespace ts {
62336233 }
62346234
62356235 function getDefaultConstraintOfConditionalType(type: ConditionalType) {
6236- return getUnionType([getTrueTypeFromConditionalType (type), getFalseTypeFromConditionalType(type)]);
6236+ return getUnionType([getInferredTrueTypeFromConditionalType (type), getFalseTypeFromConditionalType(type)]);
62376237 }
62386238
62396239 function getConstraintOfDistributiveConditionalType(type: ConditionalType): Type {
@@ -8343,16 +8343,19 @@ namespace ts {
83438343 // If this is a distributive conditional type and the check type is generic we need to defer
83448344 // resolution of the conditional type such that a later instantiation will properly distribute
83458345 // over union types.
8346- if (! root.isDistributive || ! maybeTypeOfKind(checkType, TypeFlags.Instantiable)) {
8346+ const isDeferred = root.isDistributive && maybeTypeOfKind(checkType, TypeFlags.Instantiable);
83478347 let combinedMapper: TypeMapper;
83488348 if (root.inferTypeParameters) {
83498349 const context = createInferenceContext(root.inferTypeParameters, /*signature*/ undefined, InferenceFlags.None);
8350+ if (!isDeferred) {
83508351 // We don't want inferences from constraints as they may cause us to eagerly resolve the
83518352 // conditional type instead of deferring resolution. Also, we always want strict function
83528353 // types rules (i.e. proper contravariance) for inferences.
83538354 inferTypes(context.inferences, checkType, extendsType, InferencePriority.NoConstraints | InferencePriority.AlwaysStrict);
8355+ }
83548356 combinedMapper = combineTypeMappers(mapper, context);
83558357 }
8358+ if (!isDeferred) {
83568359 // Return union of trueType and falseType for 'any' since it matches anything
83578360 if (checkType.flags & TypeFlags.Any) {
83588361 return getUnionType([instantiateType(root.trueType, combinedMapper || mapper), instantiateType(root.falseType, mapper)]);
@@ -8381,6 +8384,7 @@ namespace ts {
83818384 result.checkType = erasedCheckType;
83828385 result.extendsType = extendsType;
83838386 result.mapper = mapper;
8387+ result.combinedMapper = combinedMapper;
83848388 result.aliasSymbol = root.aliasSymbol;
83858389 result.aliasTypeArguments = instantiateTypes(root.aliasTypeArguments, mapper);
83868390 return result;
@@ -8394,6 +8398,12 @@ namespace ts {
83948398 return type.resolvedFalseType || (type.resolvedFalseType = instantiateType(type.root.falseType, type.mapper));
83958399 }
83968400
8401+ function getInferredTrueTypeFromConditionalType(type: ConditionalType) {
8402+ return type.combinedMapper ?
8403+ type.resolvedInferredTrueType || (type.resolvedInferredTrueType = instantiateType(type.root.trueType, type.combinedMapper)) :
8404+ getTrueTypeFromConditionalType(type);
8405+ }
8406+
83978407 function getInferTypeParameters(node: ConditionalTypeNode): TypeParameter[] {
83988408 let result: TypeParameter[];
83998409 if (node.locals) {
0 commit comments