interface Person {
name: string;
age: number;
}
type K3 = keyof { [x: string]: Person }; // string | number
为啥是string | number?
interface Person {
name: string;
age: number;
}
type K3 = keyof { [x: string]: Person }; // string | number
为啥是string | number?
规定如此。
因为 JS 中其实只有字符串类型的索引类型,Number 也会被转为 String,这在语法上是支持的。
const obj: { [x: string]: any } = {};
obj[1]; // 语法上是支持的,实际等于 obj['1'],实际上数组也是基于此
可以看官方的文档:
https://www.typescriptlang.or...Note that in this example,
M
isstring | number
— this is because JavaScript object keys are always coerced to a string, soobj[0]
is always the same asobj["0"]
.
但反过来不一样:
const obj: { [x: number]: any } = {};
这样会认为你已经打算把 obj
当作类数组了,所以会很“贴心”地帮你排除掉 string 作为 key。
因为js对象属性不区分number还是string,从类型兼容上来说number的属性是兼容的,比如
a这里并不会提示类型错误,但反过来不行