ts keyof疑问,为什么k3的结果是string | number?

作者站长头像
站长
· 阅读数 5
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个回答
avatar
test
2024-07-08

其实想问的是为什么会有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的联合类型

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容