@@ -21840,6 +21840,20 @@ namespace ts {
2184021840 return t;
2184121841 }
2184221842
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+
2184321857 function clearCachedInferences(inferences: InferenceInfo[]) {
2184421858 for (const inference of inferences) {
2184521859 if (!inference.isFixed) {
@@ -27055,12 +27069,10 @@ namespace ts {
2705527069 const inferenceContext = getInferenceContext(node);
2705627070 // If no inferences have been made, nothing is gained from instantiating as type parameters
2705727071 // 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))) {
2705927073 // For contextual signatures we incorporate all inferences made so far, e.g. from return
2706027074 // 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);
2706427076 }
2706527077 if (inferenceContext?.returnMapper) {
2706627078 // For other purposes (e.g. determining whether to produce literal types) we only
@@ -29950,7 +29962,11 @@ namespace ts {
2995029962 const returnContext = createInferenceContext(signature.typeParameters!, signature, context.flags);
2995129963 const returnSourceType = instantiateType(contextualType, outerContext && outerContext.returnMapper);
2995229964 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+ }
2995429970 }
2995529971 }
2995629972 }
0 commit comments