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的类型操作符,它接受两个类型参数T和U。T是一个对象类型,U是一个类型。PickByType的目的是从对象T中选择所有属性,这些属性的值类型是U。
实现原理:
- 使用
keyof T遍历对象T的所有属性键。 - 使用
T[K] extends U ? K : never来检查每个属性的值类型是否为U。如果是,则将该键添加到结果对象中;否则,将其添加到never类型中,从而被排除在结果之外。
很难想象这道题和上一道题是同一个难度下面的............