export type Diff = ({ [P in T]: P; } & { [P in U]: never; } & { [x: string]: never; })[T]; export type Omit = { [P in Diff]: T[P]; }; export type RecursivePartial = { [P in keyof T]?: RecursivePartial; }; export type NonAbstract = { [P in keyof T]: T[P]; }; export type Constructor = new (...args: any[]) => T;