PickByType
约 296 字小于 1 分钟
2022-12-01
题目
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 }>>,
]