![](/img/trans.png)
[英]Why does `keyof any` have type of `string | number | symbol` in typescript?
[英]TypesScript: Why does keyof {} have the type never?
当应用于空的 object 时,我对keyof
运算符感到困惑。 示例代码:
const o = {};
const k : Array<keyof typeof o> = [];
// k has type never[]
为什么类型never
? 我认为 never 是永远不会返回的函数的返回类型。 类型不应该是any[]
吗?
像这样更改 object 时,类型有意义:
const o = {a: 1, b: 2};
const k : Array<keyof typeof o> = [];
// k has the type ("a" | "b")[]
我在实现返回 object 的键入键的 function 时发现了这种行为:
function getKeys(o: object) {
return Object.keys(o) as Array<keyof typeof o>;
}
function 有返回类型never[]
但如果我是正确的,实际上应该有(keyof typeof o)[]
编辑:好的,所以,更新后问题对我来说更清楚了。 这里的问题是您没有使用 generics,因此您实际上是在向 TS 询问object的密钥,而不是某些 object的密钥。
您可以这样重新排列 function:
function getKeys<O extends {}>(o: O) {
return Object.keys(o) as Array<keyof O>;
}
这样它将接受 O 类型的通用object,在这种情况下, keyof O
将准确键入Array<keyof O>
。 例如:
const keys = getKeys({ a: 1, b: 2 });
// Now keys has type ("a" | "b")[]
帖子编辑前的旧答案:
never
表示永远不会出现的值,如TS Doc中所述。 就是这种情况,因为 object 中没有键。 为了更好地理解它,来自 TS Doc 的声明可能会有所帮助:
never 类型是每个类型的子类型,并且可以分配给每个类型;
这意味着,在这种情况下,never 正确地是字符串的子类型,尤其是“没有字符串”和“没有键”的意思。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.