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;