[英]How do you define multiple yield types in a TypeScript iterable?
我有一个可迭代的数组解构,它可以工作,但不能正确地进行类型检查。 我对 TypeScript 很陌生,所以我猜我做错了什么。 我正在使用 TypeScript 3.8.2。
此示例有效,因为没有发生类型检查,但取消注释最后一行会导致此代码示例下方的错误出现。
function MakeIterable<T> (a: T, b: number, c: boolean) {
const result = [ a, b, c ]
function* gen(): Generator<T | number | boolean, void, void> {
let v
while (v = result.shift()) {
yield v
}
}
return gen()
}
const [a, b, c] = MakeIterable(new Date(), 5, true)
console.log(a, b, c)
// a.setDate(0)
取消注释a.setDate(0)
后出现错误 output :
Error:(16, 7) TS2339: Property 'setDate' does not exist on type 'number | boolean | Date'.
Property 'setDate' does not exist on type 'number'.
此外,修改生成器定义以将其限制为一种返回类型可以修复它,但迭代器中的第二项和第三项将不是 TypeScript 认为的类型。 TypeScript 认为在这种情况下所有项目都必须是 Date 对象。
修改示例行:
function* gen(): Generator<T, void, void> {
问题:定义从迭代器返回的不同值类型的正确方法是什么? 理想情况下,按顺序排列的类型(在本例中为T, number, boolean
)会很好。
Generator
或Iterator
的类型定义不支持返回类型的有序序列 - 更严格的生成器。 但是,从逻辑上讲,返回类型的有序序列会更频繁地被破坏。
它仅适用于最简单的情况,即在同一范围/文件中按顺序调用next()
直到序列结束。 给定的例子太琐碎了,所以可以完全省略生成器。
例如,如果通过事件处理程序调用next()
,或者在多个组件之间共享生成器,则指定类型的顺序可能会导致运行时错误。 因此,联合类型T | number | boolean
T | number | boolean
T | number | boolean
适用于发电机 output。
涵盖所有用例的正确方法是对返回值使用类型保护。
if (a instanceof Date) {
a.setDate(0);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.