ts中,keyof用法

interface Person {
    name: string;
    age: number;
}

type K3 = keyof { [x: string]: Person };  // string | number

为啥是string | number?

阅读 5.1k
2 个回答

因为js对象属性不区分number还是string,从类型兼容上来说number的属性是兼容的,比如

type A = {
    [x: string]: string;
}

const a : A = {
    1: '234'
} // ok

a这里并不会提示类型错误,但反过来不行

规定如此。

因为 JS 中其实只有字符串类型的索引类型,Number 也会被转为 String,这在语法上是支持的。

const obj: { [x: string]: any } = {};
obj[1]; // 语法上是支持的,实际等于 obj['1'],实际上数组也是基于此

可以看官方的文档:
https://www.typescriptlang.or...

Note that in this example, M is string | number — this is because JavaScript object keys are always coerced to a string, so obj[0] is always the same as obj["0"].

但反过来不一样:

const obj: { [x: number]: any } = {};

这样会认为你已经打算把 obj 当作类数组了,所以会很“贴心”地帮你排除掉 string 作为 key。