export type ValueOf = T[keyof T]; export type LiteralUnion = T | (Pick & {_?: never}); export interface ArrayLike { [index: number]: T; length: number; } export type Unique = Pick>; export type MergeObject = { [K in keyof T & keyof U]: T[K] extends Record ? U[K] extends Record ? Merged : T[K] : T[K]; }; export type Merged = Unique & Unique & MergeObject; type IfEquals = (() => T extends X ? 1 : 2) extends (() => T extends Y ? 1 : 2) ? A : B; type WritableKeysOf = { [P in keyof T]: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, P, never> }[keyof T]; type WritablePart = Pick>; export type NoFunctions = { [P in keyof T as T[P] extends Function ? never : P]: T[P] }; export type Attributes = NoFunctions>;