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

TypeScript生成器yield类型声明问题:迭代时无法识别类型如何解决?

解决TypeScript生成器迭代值类型未正确识别的问题

问题出在你定义生成器时指定的泛型类型上:Generator<T, void, T>中的第三个参数表示next()方法接收的参数类型,但你的生成器并没有处理外部传入的next()参数,这个多余的类型声明干扰了TypeScript的类型推断。

解决方案一:修正生成器泛型类型

将生成器的返回类型改为Generator<T, void, void>,明确表示不接收next()参数:

export const fisherYatesShuffle = function* <T>(deck: Array<T>): Generator<T, void, void> {
    for (let i = deck.length - 1; i >= 0; i--) {
        const swapIndex = Math.floor(Math.random() * (i + 1));
        [deck[i], deck[swapIndex]] = [deck[swapIndex], deck[i]];
        yield deck[i];
    }
};

解决方案二:省略显式返回类型,让TypeScript自动推断

TypeScript可以根据函数体中的yield语句和返回逻辑自动推导出生成器的类型,无需手动声明:

export const fisherYatesShuffle = function* <T>(deck: Array<T>) {
    for (let i = deck.length - 1; i >= 0; i--) {
        const swapIndex = Math.floor(Math.random() * (i + 1));
        [deck[i], deck[swapIndex]] = [deck[swapIndex], deck[i]];
        yield deck[i];
    }
};

修改后,迭代时变量V的类型会被正确识别为string,甚至不需要显式传入<string>泛型参数——TypeScript会从数组['a','b','c']自动推断出类型:

for(const V of fisherYatesShuffle(['a','b','c'])){
  // V 的类型现在为 string
}

内容的提问来源于stack exchange,提问作者Alexander Mills

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:45:41