高级技巧
keyof
keyof
与 Object.keys
略有相似,只不过 keyof
取 interface
的键
1 | interface Point { |
使用 typescript
实现一个 get
函数来获取它的属性值
1 | const data = { |
但是它无法确认返回值类型, 也无法对 key 进行约束
这时候可以使用 keyof
1 | function get<T extends object, K extends keyof T>(o: T, name: K): T[K] { |
给定一个对象类型 X
,keyof X
的类型求值过程如下:
- 如果
X
包含字符串索引签名,那么keyof X
的值为string
、number
和类符号属性名的字面量类型组成的联合类型,否则下一步 - 如果
X
包含数值索引签名,那么keyof X
的值为number
和类字符串与类符号属性名的字面量类型组成的联合类型,否则下一步 keyof X
的值为类字符串、类数值和类符号属性名的字面量类型组成的联合类型
其中,
- 对象的类字符串(string-like)属性名包括标识符、字符串字面量和字符串字面量类型的计算属性名
- 对象的类数值(number-like)属性名包括数值字面量和数值字面量类型的计算属性名
- 对象的类符号(symbol-like)属性名包括符号类型的计算属性名
1 | const c = "c"; |
typeof
在 TypeScript 中,typeof
操作符可以用来获取一个变量声明或对象的类型。
1 | interface Person { |