[TypeScript] Type Challenges #2852 - OmitByType

12 阅读1分钟

题目描述

From T, pick a set of properties whose type are not assignable to U.

For Example

type OmitBoolean = OmitByType<{
  name: string
  count: number
  isReadonly: boolean
  isEnable: boolean
}, boolean> // { name: string; count: number }

题解

// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'

interface Model {
  name: string
  count: number
  isReadonly: boolean
  isEnable: boolean
}

type cases = [
  Expect<Equal<OmitByType<Model, boolean>, { name: string; count: number }>>,
  Expect<Equal<OmitByType<Model, string>, { count: number; isReadonly: boolean; isEnable: boolean }>>,
  Expect<Equal<OmitByType<Model, number>, { name: string; isReadonly: boolean; isEnable: boolean }>>,
]


// ============= Your Code Here =============
type OmitByType<T, U> = {
  [P in keyof T as 
  	T[P] extends U 
  		? never 
  		: P
  ]: T[P]
}

条件类型

type OmitByType<T, U> = {
  [P in keyof T as 
  	T[P] extends U 
  		? never 
  		: P
  ]: T[P]
}
  • 遍历T的每个键P

    • [P in keyof T]:遍历T的所有键
  • 条件映射:

    • as T[P] extends U ? never : P

      • 如果T[P]的类型可以赋值给U,则映射为never,从而排除该键

      • 否则,保留键P

  • 类型赋值:

    • T[P]:保留T中的每个键P的值