@@ -31929,16 +31929,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
31929
31929
// return type of 'wrap'.
31930
31930
if (node.kind !== SyntaxKind.Decorator) {
31931
31931
const skipBindingPatterns = every(signature.typeParameters, p => !!getDefaultFromTypeParameter(p));
31932
- const contextualType = getContextualType(node, skipBindingPatterns ? ContextFlags.SkipBindingPatterns : ContextFlags.None);
31932
+ let contextualType = getContextualType(node, skipBindingPatterns ? ContextFlags.SkipBindingPatterns : ContextFlags.None);
31933
31933
if (contextualType) {
31934
31934
const inferenceTargetType = getReturnTypeOfSignature(signature);
31935
- const targetConstraint = getConstraintOfType(inferenceTargetType);
31936
- const applicableContextualType = targetConstraint && !isTypeAssignableTo(targetConstraint, contextualType) ?
31937
- filterType(contextualType, t => isTypeAssignableTo(t, targetConstraint)) :
31938
- contextualType;
31939
31935
if (couldContainTypeVariables(inferenceTargetType)) {
31936
+ const targetConstraint = getConstraintOfType(inferenceTargetType);
31937
+ contextualType = targetConstraint ? getIntersectionType([contextualType, targetConstraint]) : contextualType;
31940
31938
const outerContext = getInferenceContext(node);
31941
- const isFromBindingPattern = !skipBindingPatterns && getContextualType(node, ContextFlags.SkipBindingPatterns) !== applicableContextualType ;
31939
+ const isFromBindingPattern = !skipBindingPatterns && getContextualType(node, ContextFlags.SkipBindingPatterns) !== contextualType ;
31942
31940
// A return type inference from a binding pattern can be used in instantiating the contextual
31943
31941
// type of an argument later in inference, but cannot stand on its own as the final return type.
31944
31942
// It is incorporated into `context.returnMapper` which is used in `instantiateContextualType`,
@@ -31954,7 +31952,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
31954
31952
// outer call expression. Effectively we just want a snapshot of whatever has been
31955
31953
// inferred for any outer call expression so far.
31956
31954
const outerMapper = getMapperFromContext(cloneInferenceContext(outerContext, InferenceFlags.NoDefault));
31957
- const instantiatedType = instantiateType(applicableContextualType , outerMapper);
31955
+ const instantiatedType = instantiateType(contextualType , outerMapper);
31958
31956
// If the contextual type is a generic function type with a single call signature, we
31959
31957
// instantiate the type with its own type parameters and type arguments. This ensures that
31960
31958
// the type parameters are not erased to type any during type inference such that they can
@@ -31974,7 +31972,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
31974
31972
// the source type uses the outer context's return mapper (which excludes inferences made from
31975
31973
// outer arguments), and (b) we don't want any further inferences going into this context.
31976
31974
const returnContext = createInferenceContext(signature.typeParameters!, signature, context.flags);
31977
- const returnSourceType = instantiateType(applicableContextualType , outerContext && outerContext.returnMapper);
31975
+ const returnSourceType = instantiateType(contextualType , outerContext && outerContext.returnMapper);
31978
31976
inferTypes(returnContext.inferences, returnSourceType, inferenceTargetType);
31979
31977
context.returnMapper = some(returnContext.inferences, hasInferenceCandidates) ? getMapperFromContext(cloneInferredPartOfContext(returnContext)) : undefined;
31980
31978
}
0 commit comments