mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Do not infer yield* type from contextual TReturn (#58621)
This commit is contained in:
+16
-6
@@ -30915,9 +30915,19 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
if (!node.asteriskToken && contextualReturnType.flags & TypeFlags.Union) {
|
||||
contextualReturnType = filterType(contextualReturnType, type => !!getIterationTypeOfGeneratorFunctionReturnType(IterationTypeKind.Return, type, isAsyncGenerator));
|
||||
}
|
||||
return node.asteriskToken
|
||||
? contextualReturnType
|
||||
: getIterationTypeOfGeneratorFunctionReturnType(IterationTypeKind.Yield, contextualReturnType, isAsyncGenerator);
|
||||
if (node.asteriskToken) {
|
||||
const iterationTypes = getIterationTypesOfGeneratorFunctionReturnType(contextualReturnType, isAsyncGenerator);
|
||||
const yieldType = iterationTypes?.yieldType ?? silentNeverType;
|
||||
const returnType = getContextualType(node, contextFlags) ?? silentNeverType;
|
||||
const nextType = iterationTypes?.nextType ?? unknownType;
|
||||
const generatorType = createGeneratorType(yieldType, returnType, nextType, /*isAsyncGenerator*/ false);
|
||||
if (isAsyncGenerator) {
|
||||
const asyncGeneratorType = createGeneratorType(yieldType, returnType, nextType, /*isAsyncGenerator*/ true);
|
||||
return getUnionType([generatorType, asyncGeneratorType]);
|
||||
}
|
||||
return generatorType;
|
||||
}
|
||||
return getIterationTypeOfGeneratorFunctionReturnType(IterationTypeKind.Yield, contextualReturnType, isAsyncGenerator);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37829,7 +37839,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
}
|
||||
|
||||
if (isGenerator) {
|
||||
return createGeneratorReturnType(
|
||||
return createGeneratorType(
|
||||
yieldType || neverType,
|
||||
returnType || fallbackReturnType,
|
||||
nextType || getContextualIterationType(IterationTypeKind.Next, func) || unknownType,
|
||||
@@ -37846,7 +37856,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
}
|
||||
}
|
||||
|
||||
function createGeneratorReturnType(yieldType: Type, returnType: Type, nextType: Type, isAsyncGenerator: boolean) {
|
||||
function createGeneratorType(yieldType: Type, returnType: Type, nextType: Type, isAsyncGenerator: boolean) {
|
||||
const resolver = isAsyncGenerator ? asyncIterationTypesResolver : syncIterationTypesResolver;
|
||||
const globalGeneratorType = resolver.getGlobalGeneratorType(/*reportErrors*/ false);
|
||||
yieldType = resolver.resolveIterationType(yieldType, /*errorNode*/ undefined) || unknownType;
|
||||
@@ -40648,7 +40658,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
const generatorYieldType = getIterationTypeOfGeneratorFunctionReturnType(IterationTypeKind.Yield, returnType, (functionFlags & FunctionFlags.Async) !== 0) || anyType;
|
||||
const generatorReturnType = getIterationTypeOfGeneratorFunctionReturnType(IterationTypeKind.Return, returnType, (functionFlags & FunctionFlags.Async) !== 0) || generatorYieldType;
|
||||
const generatorNextType = getIterationTypeOfGeneratorFunctionReturnType(IterationTypeKind.Next, returnType, (functionFlags & FunctionFlags.Async) !== 0) || unknownType;
|
||||
const generatorInstantiation = createGeneratorReturnType(generatorYieldType, generatorReturnType, generatorNextType, !!(functionFlags & FunctionFlags.Async));
|
||||
const generatorInstantiation = createGeneratorType(generatorYieldType, generatorReturnType, generatorNextType, !!(functionFlags & FunctionFlags.Async));
|
||||
|
||||
return checkTypeAssignableTo(generatorInstantiation, returnType, errorNode);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user