题目描述
From T, pick a set of properties whose type are assignable to U.
For Example
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, U> = {
[K in keyof T as T[K] extends U ? K : never]: T[K]
}
映射类型和条件类型
type PickByType<T, U> = {
[P in keyof T as
T[P] extends U
? P
: never
]: T[P]
}
-
遍历
T的每个键P:[P in keyof T]:遍历T的所有键
-
条件映射:
-
as T[P] extends U ? P : never:-
如果
T[P]的类型可以赋值给U,则保留键P -
否则,映射为
never,从而排除该键
-
-
-
类型赋值:
T[P]:保留T中的每个键P的值