export type Mutable = { -readonly [P in keyof T]: T[P]; }; export type ValueOf = T[keyof T]; export type Merge = Omit & N; /** utility type to assert that the second type is a subtype of the first type. * Returns the subtype. */ export type SubtypeOf = Subtype; export type ResolutionType any> = T extends (...args: any) => Promise ? R : any; export type MarkOptional = Omit & Partial>; export type MarkRequired = Exclude & Required>; export type MarkNonNullable = { [P in K]-?: P extends K ? NonNullable : T[P]; } & { [P in keyof T]: T[P]; }; export type NonOptional = Exclude; export type SignatureType = T extends (...args: infer R) => any ? R : never; export type CallableType any> = (...args: SignatureType) => ReturnType; export type ForwardRef = Parameters>>[1]; export type ExtractSetType> = T extends Set ? U : never; export type SameType = T extends U ? (U extends T ? true : false) : false; export type Assert = T; export type NestedKeyOf = K extends keyof T & (string | number) ? `${K}` | (T[K] extends object ? `${K}.${NestedKeyOf}` : never) : never; export type SetLike = Set | T[]; export type ReadonlySetLike = ReadonlySet | readonly T[]; export type MakeBrand = { [K in `~brand~${T}`]: T; }; /** Maybe just promise or already fulfilled one! */ export type MaybePromise = T | Promise; export type AllPossibleKeys = T extends any ? keyof T : never; /** Strip all the methods or functions from a type */ export type DTO = { [K in keyof T as T[K] extends Function ? never : K]: T[K]; }; export type MapEntry> = M extends Map ? [K, V] : never;