type-challenges:PickByType

62 阅读1分钟

PickByType

问题描述

T 中选择一组属性,它们的类型可以赋值给 U

举例:

type OnlyBoolean = PickByType<{
  name: string
  count: number
  isReadonly: boolean
  isEnable: boolean
}, boolean> // { isReadonly: boolean; isEnable: boolean; }
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'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 }>>
]
​
// ============= Your Code Here =============
// 答案
type PickByType<T extends object, U> = {
  [K in keyof T as T[K] extends U ? K : never]: T[K]
}
​

这段代码定义了一个名为PickByType的类型操作符,它接受两个类型参数TUT是一个对象类型,U是一个类型。PickByType的目的是从对象T中选择所有属性,这些属性的值类型是U

实现原理:

  1. 使用keyof T遍历对象T的所有属性键。
  2. 使用T[K] extends U ? K : never来检查每个属性的值类型是否为U。如果是,则将该键添加到结果对象中;否则,将其添加到never类型中,从而被排除在结果之外。

很难想象这道题和上一道题是同一个难度下面的............