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

type cases = [
  Expect<Equal<MyExclude<'a' | 'b' | 'c', 'a'>, Exclude<'a' | 'b' | 'c', 'a'>>>,
  Expect<Equal<MyExclude<'a' | 'b' | 'c', 'a' | 'b'>, Exclude<'a' | 'b' | 'c', 'a' | 'b'>>>,
  Expect<Equal<MyExclude<string | number | (() => void), Function>, Exclude<string | number | (() => void), Function>>>,
]

// ============= Your Code Here =============
type MyExclude<T, U> = T extends U ? never : T;

Ts 是结构化类型的,父子类型的判断往往是结构是否一致

T extends U 用于区分 T是否为U的子类型

如果为U的子类型则 never(类型窄化) 可以理解为剔除

任何的类型值 T | never ⇒ T

T extends U ? T : T

T ⇒ ‘a’ | ‘b’ | ‘c’

U ⇒ ‘a’ | ‘b’

⇒ T

T extends U ? never: T

⇒ ‘a’ | ‘b’ | never

⇒ ‘a’ | ‘b’