You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:04:57