type-challenges:OmitByType

38 阅读1分钟

OmitByType

从 T 中选择一组其类型不可赋值给 U 的属性。

举例:

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 extends object, U> = {
  [K in keyof T as T[K] extends U ? never : K]: T[K]
}
​

简单题,只需要判断第二个泛型参数是否继承自 T[K] 即可。