How to exclude an overload in TypeScript?

4 weeks ago 22
ARTICLE AD BOX

How can I achieve the reverse of joining two function signatures together in TypeScript?

type A = (v1: number, v2: number) => number type B = (v1: string, v2: string) => string type C = A & B; declare const c: C; c(1, 2); c("a", "b"); c(1, "b"); // <- gives error as expected type D = Exclude<C, A> // never

/edit: It is actually possible to remove the overload in the example above, but not below in type D1.

type A = { (v1: number, v2: number): number; } type B = { (v1: string, v2: string): string; } type C = A & B; type E = C extends (A & infer U) ? U : never // (v1: string, v2: string) => string // type A1 = (v1: number, v2: number) => number type B1 = (v1: string, v2: string) => string type C1 = A1 & B1; type E1 = C1 extends (A1 & infer U) ? U : never // (v1: string, v2: string) => string // type D = { (v1: number, v2: number): number; (v1: string, v2: string): string; } type D2 = D extends A ? true : false // true type D1 = D extends (A & infer U) ? U : never // both overloads

related: Reuse function overloading in typescript

Read Entire Article