// Remove types from T that are assignable to U type Diff‹T, U› = T extends U ? never : T; // Remove types from T that are not assignable to U type Filter‹T, U› = T extends U ? T : never; type T30 = Diff‹"a" | "b" | "c" | "d", "a" | "c" | "f"›; // "b" | "d" type T31 = Filter‹"a" | "b" | "c" | "d", "a" | "c" | "f"›; // "a" | "c" type T32 = Diff‹string | number | (() =› void), Function›; // string | number type T33 = Filter‹string | number | (() =› void), Function›; // () =› void type NonNullable‹T› = Diff‹T, null | undefined›; // Remove null and undefined from T type T34 = NonNullable‹string | number | undefined›; // string | number type T35 = NonNullable‹string | string[] | null | undefined›; // string | string[] function f1‹T›(x: T, y: NonNullable‹T›) { x = y; // Ok y = x; // Error } function f2‹T extends string | undefined›(x: T, y: NonNullable‹T›) { x = y; // Ok y = x; // Error let s1: string = x; // Error let s2: string = y; // Ok }