Skip to content

Commit dc3eb3c

Browse files
committed
Erase 'infer T' locations in conditional type constraints
1 parent 66bf5b4 commit dc3eb3c

2 files changed

Lines changed: 16 additions & 2 deletions

File tree

src/compiler/checker.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

src/compiler/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3878,7 +3878,11 @@ namespace ts {
38783878
resolvedTrueType?: Type;
38793879
resolvedFalseType?: Type;
38803880
/* @internal */
3881+
resolvedInferredTrueType?: Type;
3882+
/* @internal */
38813883
mapper?: TypeMapper;
3884+
/* @internal */
3885+
combinedMapper?: TypeMapper;
38823886
}
38833887

38843888
// Type parameter substitution (TypeFlags.Substitution)

0 commit comments

Comments
 (0)