keyof 类型操作符
简单来看就是获取key值的一个联合,如果是索引签名,则直接返回这些类型
数字字面量联合类型
keyof 也可能返回一个数字字面量的联合类型
1 | const NumericObject = { |
Symbol
TypeScript 也可以支持 symbol 类型的属性名
1 | const sym1 = Symbol(); |
所以有时候在使用字符串类型时会报错,因为无法指定symbol为string
如果确定只使用字符串类型的属性名,可以这么写
1 | function useKey<T, K extends Extract<keyof T, string>>(o: T, k: K) { |
或者使用联合类型去处理
对于keyof的一些疑问
当想要获取Map类型的key值组成的时候,该如何操作?
1 | const map1: Map<object, string> = new Map(); |
上述操作会产生问题,即无法拿到Map内key值的类型
搜索后发现ts没有对这块做处理,但是可以手动实现
1 | type KeyOfMap<M extends Map<unknown, unknown>> = M extends Map<infer K, unknown> |