Skip to content

Instantly share code, notes, and snippets.

@forivall
Created November 4, 2023 02:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save forivall/ae4902eda7aa2b3108d34033701880eb to your computer and use it in GitHub Desktop.
Save forivall/ae4902eda7aa2b3108d34033701880eb to your computer and use it in GitHub Desktop.
override signatures
export type Overrides<T extends (...args: any) => any> = T extends {
(...args: infer A0): infer R0;
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
(...args: infer A7): infer R7;
(...args: infer A8): infer R8;
}
? [
(...args: A0) => R0,
(...args: A1) => R1,
(...args: A2) => R2,
(...args: A3) => R3,
(...args: A4) => R4,
(...args: A5) => R5,
(...args: A6) => R6,
(...args: A7) => R7,
(...args: A8) => R8,
]
: T extends {
(...args: infer A0): infer R0;
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
(...args: infer A7): infer R7;
}
? [
(...args: A0) => R0,
(...args: A1) => R1,
(...args: A2) => R2,
(...args: A3) => R3,
(...args: A4) => R4,
(...args: A5) => R5,
(...args: A6) => R6,
(...args: A7) => R7,
]
: T extends {
(...args: infer A0): infer R0;
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
}
? [
(...args: A0) => R0,
(...args: A1) => R1,
(...args: A2) => R2,
(...args: A3) => R3,
(...args: A4) => R4,
(...args: A5) => R5,
(...args: A6) => R6,
]
: T extends {
(...args: infer A0): infer R0;
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
}
? [
(...args: A0) => R0,
(...args: A1) => R1,
(...args: A2) => R2,
(...args: A3) => R3,
(...args: A4) => R4,
(...args: A5) => R5,
]
: T extends {
(...args: infer A0): infer R0;
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
}
? [
(...args: A0) => R0,
(...args: A1) => R1,
(...args: A2) => R2,
(...args: A3) => R3,
(...args: A4) => R4,
]
: T extends {
(...args: infer A0): infer R0;
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
}
? [
(...args: A0) => R0,
(...args: A1) => R1,
(...args: A2) => R2,
(...args: A3) => R3,
]
: T extends {
(...args: infer A0): infer R0;
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
}
? [(...args: A0) => R0, (...args: A1) => R1, (...args: A2) => R2]
: T extends {
(...args: infer A0): infer R0;
(...args: infer A1): infer R1;
}
? [(...args: A0) => R0, (...args: A1) => R1]
: [T];
type ZeroToEight = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
export type FromOverrides<T extends { length: ZeroToEight }> = [
never,
T extends [infer F] ? F : never,
T extends [
infer F1 extends (...args: any) => any,
infer F2 extends (...args: any) => any,
]
? {
(...args: Parameters<F1>): ReturnType<F1>;
(...args: Parameters<F2>): ReturnType<F2>;
}
: never,
T extends [
infer F1 extends (...args: any) => any,
infer F2 extends (...args: any) => any,
infer F3 extends (...args: any) => any,
]
? {
(...args: Parameters<F1>): ReturnType<F1>;
(...args: Parameters<F2>): ReturnType<F2>;
(...args: Parameters<F3>): ReturnType<F3>;
}
: never,
T extends [
infer F1 extends (...args: any) => any,
infer F2 extends (...args: any) => any,
infer F3 extends (...args: any) => any,
infer F4 extends (...args: any) => any,
]
? {
(...args: Parameters<F1>): ReturnType<F1>;
(...args: Parameters<F2>): ReturnType<F2>;
(...args: Parameters<F3>): ReturnType<F3>;
(...args: Parameters<F4>): ReturnType<F4>;
}
: never,
T extends [
infer F1 extends (...args: any) => any,
infer F2 extends (...args: any) => any,
infer F3 extends (...args: any) => any,
infer F4 extends (...args: any) => any,
infer F5 extends (...args: any) => any,
]
? {
(...args: Parameters<F1>): ReturnType<F1>;
(...args: Parameters<F2>): ReturnType<F2>;
(...args: Parameters<F3>): ReturnType<F3>;
(...args: Parameters<F4>): ReturnType<F4>;
(...args: Parameters<F5>): ReturnType<F5>;
}
: never,
T extends [
infer F1 extends (...args: any) => any,
infer F2 extends (...args: any) => any,
infer F3 extends (...args: any) => any,
infer F4 extends (...args: any) => any,
infer F5 extends (...args: any) => any,
infer F6 extends (...args: any) => any,
]
? {
(...args: Parameters<F1>): ReturnType<F1>;
(...args: Parameters<F2>): ReturnType<F2>;
(...args: Parameters<F3>): ReturnType<F3>;
(...args: Parameters<F4>): ReturnType<F4>;
(...args: Parameters<F5>): ReturnType<F5>;
(...args: Parameters<F6>): ReturnType<F6>;
}
: never,
T extends [
infer F1 extends (...args: any) => any,
infer F2 extends (...args: any) => any,
infer F3 extends (...args: any) => any,
infer F4 extends (...args: any) => any,
infer F5 extends (...args: any) => any,
infer F6 extends (...args: any) => any,
infer F7 extends (...args: any) => any,
]
? {
(...args: Parameters<F1>): ReturnType<F1>;
(...args: Parameters<F2>): ReturnType<F2>;
(...args: Parameters<F3>): ReturnType<F3>;
(...args: Parameters<F4>): ReturnType<F4>;
(...args: Parameters<F5>): ReturnType<F5>;
(...args: Parameters<F6>): ReturnType<F6>;
(...args: Parameters<F7>): ReturnType<F7>;
}
: never,
T extends [
infer F1 extends (...args: any) => any,
infer F2 extends (...args: any) => any,
infer F3 extends (...args: any) => any,
infer F4 extends (...args: any) => any,
infer F5 extends (...args: any) => any,
infer F6 extends (...args: any) => any,
infer F7 extends (...args: any) => any,
infer F8 extends (...args: any) => any,
]
? {
(...args: Parameters<F1>): ReturnType<F1>;
(...args: Parameters<F2>): ReturnType<F2>;
(...args: Parameters<F3>): ReturnType<F3>;
(...args: Parameters<F4>): ReturnType<F4>;
(...args: Parameters<F5>): ReturnType<F5>;
(...args: Parameters<F6>): ReturnType<F6>;
(...args: Parameters<F7>): ReturnType<F7>;
(...args: Parameters<F8>): ReturnType<F8>;
}
: never,
][T['length']];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment