@@ -21840,6 +21840,20 @@ namespace ts {
21840
21840
return t;
21841
21841
}
21842
21842
21843
+ function mapToInferredTypeIncludingReturnTypeInferences(context: InferenceContext, returnContext: InferenceContext, t: Type): Type {
21844
+ const inferences = context.inferences;
21845
+ for (let i = 0; i < inferences.length; i++) {
21846
+ const inference = inferences[i];
21847
+ if (t === inference.typeParameter) {
21848
+ if (inference.inferredType || hasInferenceCandidates(inference)) {
21849
+ return getInferredType(context, i);
21850
+ }
21851
+ return getMappedType(t, returnContext.mapper);
21852
+ }
21853
+ }
21854
+ return t;
21855
+ }
21856
+
21843
21857
function clearCachedInferences(inferences: InferenceInfo[]) {
21844
21858
for (const inference of inferences) {
21845
21859
if (!inference.isFixed) {
@@ -27055,12 +27069,10 @@ namespace ts {
27055
27069
const inferenceContext = getInferenceContext(node);
27056
27070
// If no inferences have been made, nothing is gained from instantiating as type parameters
27057
27071
// would just be replaced with their defaults similar to the apparent type.
27058
- if (inferenceContext && contextFlags! & ContextFlags.Signature && (inferenceContext.returnMapper || some(inferenceContext.inferences, hasInferenceCandidates))) {
27072
+ if (inferenceContext && contextFlags! & ContextFlags.Signature && (inferenceContext.combinedReturnMapper || some(inferenceContext.inferences, hasInferenceCandidates))) {
27059
27073
// For contextual signatures we incorporate all inferences made so far, e.g. from return
27060
27074
// types as well as arguments to the left in a function call.
27061
- return instantiateInstantiableTypes(contextualType, inferenceContext.returnMapper
27062
- ? combineTypeMappers(inferenceContext.nonFixingMapper, inferenceContext.returnMapper)
27063
- : inferenceContext.nonFixingMapper);
27075
+ return instantiateInstantiableTypes(contextualType, inferenceContext.combinedReturnMapper || inferenceContext.nonFixingMapper);
27064
27076
}
27065
27077
if (inferenceContext?.returnMapper) {
27066
27078
// For other purposes (e.g. determining whether to produce literal types) we only
@@ -29950,7 +29962,11 @@ namespace ts {
29950
29962
const returnContext = createInferenceContext(signature.typeParameters!, signature, context.flags);
29951
29963
const returnSourceType = instantiateType(contextualType, outerContext && outerContext.returnMapper);
29952
29964
inferTypes(returnContext.inferences, returnSourceType, inferenceTargetType);
29953
- context.returnMapper = some(returnContext.inferences, hasInferenceCandidates) ? getMapperFromContext(cloneInferredPartOfContext(returnContext)) : undefined;
29965
+ if (some(returnContext.inferences, hasInferenceCandidates)) {
29966
+ const clonedReturnContext = cloneInferredPartOfContext(returnContext)!;
29967
+ context.returnMapper = getMapperFromContext(clonedReturnContext);
29968
+ context.combinedReturnMapper = makeFunctionTypeMapper(t => mapToInferredTypeIncludingReturnTypeInferences(context, clonedReturnContext, t));
29969
+ }
29954
29970
}
29955
29971
}
29956
29972
}
0 commit comments