interface Person {
name: string;
age: number;
}
type K1 = keyof Person; // "name" | "age"
type K2 = keyof Person[]; // "length" | "toString" | "pop" | "push" | "concat" | "join"
type K3 = keyof { [x: string]: Person }; // string | number
interface Person {
name: string;
age: number;
}
type K1 = keyof Person; // "name" | "age"
type K2 = keyof Person[]; // "length" | "toString" | "pop" | "push" | "concat" | "join"
type K3 = keyof { [x: string]: Person }; // string | number
这个文档里专门写了,这是因为JavaScript对象键总是被强制转换为字符串
你真的只要 string
类型,可以用 Exclude
把 number
去掉
type K4 = Exclude<keyof { [key: string]: any }, number>
从使用上来看 number 和 string 都可以作为一个 key,而实际上 number 是会被转换为 string 的,在 ts 中自然也是遵循这个规则,即便你显式声明了 string。
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
其实想问的是为什么会有
number
,而不是单独的string
类型。先看看什么数据类型可以作为索引签名:
可见
number
也是可作为对象索引的,举个例子👇
结果是
{'1': 1, '10': 10}
虽然
number
可以作为索引签名,但是js会强制转换为string
类型所以k3的结果不只是
string
而是number
和string
的联合类型