繁体   English   中英

如何在 TypeScript 可迭代对象中定义多种产量类型?

[英]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 )会很好。

GeneratorIterator的类型定义不支持返回类型的有序序列 - 更严格的生成器 但是,从逻辑上讲,返回类型的有序序列会更频繁地被破坏。

它仅适用于最简单的情况,即在同一范围/文件中按顺序调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM