问题 #
从对象中挑选出指定类型的属性
interface Model {
name: string
count: number
isReadonly: boolean
isEnable: boolean
}
type case1 = PickByType<Model, boolean> // { isReadonly: boolean; isEnable: boolean }
type case2 = PickByType<Model, string> // { name: string }
type case3 = PickByType<Model, number> // { count: number }
解答 #
type PickByType<T, U> = {
[ K in keyof T as T[K] extends U ? K : never ]: U
}
拆分 #
- 可以把索引签名看成两个部分
K in keyof T
T[K] extends U ? K : never
1.1
是用来索引泛型T
as
用来断言K
是T[K]
的索引签名1.2
是用来确认T[K]
是U
的类型- 不是
U
类型的直接用never
过滤掉