TS中keyof 操作符

49 阅读1分钟

keyof 操作符

使用 keyof 操作符可以获取一个对象类型的所有 key 或 数字字面量组合的联合类型。比如

type Person = {
  name: string
  age: number
  heigh: number
  weigh: number
}

type Keys = keyof Person // 'name' | 'age' | 'heigh' | 'weigh'

获取的 Keys 和 'name' | 'age' | 'heigh' | 'weigh' 等价。通常在代码中需要通过 key 遍历对象或者判断属性时,可以使用。

function print(obj: Person, key: Keys) {
  console.log(obj[key])
}

对于对象类型 key 是 数字或者字符串的情况,keyof 会返回下面的情况:

type Arrayish = { [n: number]: unknown };
type A = keyof Arrayish; // type A = number
 
type Mapish = { [k: string]: boolean };
type M = keyof Mapish; // type M = string | number

为什么会有 keyof ?

在 js 中我们经常需要通过 obj[key] 的形式去动态访问对象的某个属性。这个时候如果没有对象上并不存在某个 key,并且没有对 key 做类型约束,很可能导致 bug 的产生。

比如:

console.log(person['gender'])

Person 类型并不存在 gender 属性。

在已经声明 Person 类型的情况下,直接使用 keyof 生成 Keys 对动态 key 进行类型约束会更加安全。

作者:剑大瑞
链接:juejin.cn/post/723667…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。