生成元组时,为什么打字稿会合并两个索引的类型?

When yielding a tuple, why does typescript union the types of both indices?

我从生成器函数生成一个值类型为 [number, object] 的数组,并通过 for...of 循环迭代该函数。当使用 for (const [k, v] of iterator()) 解构值时,v 的类型是 number | object。我希望它具有类型 object- 与我在生成器函数的 yield 中使用的类型相同。

我已经为我在打字稿 REPL 中遇到的问题创建了一个演示 here

问题出在第 22 行,打字稿编译器抱怨访问的密钥在解构后可能不存在。

为什么 typescript 认为解构变量可能属于这两种类型?

这不是生成器问题。数组文字通常扩展为数组类型。如果您使用 as const 断言来保留元组类型,它会按预期工作

(function iterate() {
    function* iterator() {
        let id: number = 0;
        const value: {
            a: number,
            b: number
        } = {
            a: 1,
            b: 2
        };
        while (id < 10) {
            yield [
                id,
                value
            ] as const;

            id += 1;
        }
    }

    for (const [k, v] of iterator()) {
        console.log(k, v.a);
    }
})();