如何让TypeScript更好地识别联合类型中的生成器?
Generator联合void时的TypeScript类型推断问题解决
问题场景
以下代码中,TypeScript会抛出类型错误:
type Union = () => Generator<undefined, void, number> | void; function callbacker(_callback: Union) {} callbacker(function* () { const value = yield; });
报错信息:
'yield' expression implicitly results in an 'any' type because its containing generator lacks a return-type annotation.
移除联合类型中的void可解决报错,但业务需求需要保留void,且不能修改callbacker的调用逻辑(作为库代码,希望用户能获得自动类型推断)。
解决方案
使用函数重载替代联合类型定义,让TypeScript精准匹配不同的函数类型:
// 重载签名1:匹配生成器函数 function callbacker(_callback: () => Generator<undefined, void, number>): void; // 重载签名2:匹配返回void的普通函数 function callbacker(_callback: () => void): void; // 实现函数,保留原联合类型作为参数约束 function callbacker(_callback: () => Generator<undefined, void, number> | void) {} callbacker(function* () { const value = yield; // 自动推断value为number,无类型报错 });
原理说明
TypeScript的函数重载会优先匹配更具体的签名:
- 当传入生成器函数时,匹配第一个重载,TypeScript能正确识别生成器的类型参数,自动推断
yield的返回值类型为number - 当传入返回
void的普通函数时,匹配第二个重载,满足业务对void类型的支持需求
这种方案无需修改调用方代码,同时保留了自动类型推断能力。
内容的提问来源于stack exchange,提问作者Ayo Reis
相关产品推荐
相关产品推荐

