type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]
type Omit<T, K extends Extract<keyof T, string>> = Pick<T, Diff<Extract<keyof T, string>, K>>
type OrNull<T> = T | null
type PartialOrNull<T> = OrNull<Partial<T>>
type ReadOnly<T> = {
readonly [P in keyof T]: T[P];
}
type Constructor<T> = new(...args: any[]) => T