Skip to content

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 }>>,
]

参考