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
相关产品推荐
相关产品推荐

