PickByType
题目
Github: PickByType
从 T
中选取一组类型可分配给 U
的属性。
type OnlyBoolean = PickByType<{
name: string
count: number
isReadonly: boolean
isEnable: boolean
}, boolean> // { isReadonly: boolean; isEnable: boolean; }
解题思路
这个挑战比较简单。让我们从 映射类型 开始,从 T
中获取所有的 键,以及对应的 值:
type PickByType<T, U> = {
[P in keyof T]: T[P]
}
接下来,我们通过 as
对 键进行重映射,过滤不满足 U
的情况:
type PickByType<T, U> = {
[P in keyof T as T[P] extends U ? P : never]: T[P]
}
答案
type PickByType<T, U> = {
[P in keyof T as T[P] extends U ? P : never]: T[P]
}
验证
interface Model {
name: string
count: number
isReadonly: boolean
isEnable: boolean
}
type cases = [
Expect<Equal<PickByType<Model, boolean>, { isReadonly: boolean, isEnable: boolean }>>,
Expect<Equal<PickByType<Model, string>, { name: string }>>,
Expect<Equal<PickByType<Model, number>, { count: number }>>,
]