问题 #
从对象中挑选出指定类型的属性
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 TT[K] extends U ? K : never1.1是用来索引泛型Tas用来断言K是T[K]的索引签名1.2是用来确认T[K]是U的类型- 不是
U类型的直接用never过滤掉