ts keyof疑问,为什么k3的结果是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
阅读 1.7k
3 个回答

其实想问的是为什么会有number,而不是单独的string类型。

先看看什么数据类型可以作为索引签名:

  1. number
  2. string
  3. symbol

可见number也是可作为对象索引的,

举个例子👇

let obj = new Object()
obj[1] = 1
obj['10'] = 10

结果是{'1': 1, '10': 10}

虽然number可以作为索引签名,但是js会强制转换为string类型

所以k3的结果不只是string而是numberstring的联合类型

这个文档里专门写了,这是因为JavaScript对象键总是被强制转换为字符串
image.png

你真的只要 string 类型,可以用 Excludenumber去掉

type K4 = Exclude<keyof { [key: string]: any }, number>

从使用上来看 number 和 string 都可以作为一个 key,而实际上 number 是会被转换为 string 的,在 ts 中自然也是遵循这个规则,即便你显式声明了 string。

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏