/* eslint-disable @typescript-eslint/ban-types */ // https://stackoverflow.com/a/60864781/10502674 type _IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? T : never; type _PlainObjectKeys = { [P in keyof T]: _IfEquals< { [Q in P]: T[P] extends Function ? never : T[P] }, { -readonly [Q in P]: T[P] }, P >; }[keyof T]; type Equals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? true : false; export type PlainObject = { [K in keyof Pick>]: T[K] extends Date ? T[K] : T[K] extends (infer U)[] ? U extends object ? PlainObject[] : U[] : T[K] extends object ? PlainObject : T[K]; };