生成元组时,为什么打字稿会合并两个索引的类型?
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);
}
})();
我从生成器函数生成一个值类型为 [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);
}
})();