export interface UpdateFn = any[]> { (value: T, ...args: A): R, } export type Key = string | number // try this approach after this PR https://github.com/microsoft/TypeScript/pull/33050 got released // type PropType = // K extends [keyof T, infer R] ? (T[K[0]] extends object ? PropType : never) // : K extends keyof T ? T[K] : never // merge functions export function merge(obj: T, ...objs: Array): T export function deepMerge(obj: T, ...objs: Array): T // target = object like, path = vector export function get(obj: T, path: Key[], def?: R): R export function assoc(obj: T, path: Key[], value: V): T export function dissoc(obj: T, path: Key[]): T export function update (obj: T, path: Key[], updateFn: UpdateFn, ...args: any[]): T // target = array, path = scalar export function dissoc(arr: T[], path: number): Array // target = object like, path = scalar export function get(obj: T, path: K, def?: T[K]): T[K] export function assoc(obj: T, path: K, value: T[K]): T export function dissoc(obj: T, path: K): Omit export function update (obj: T, path: K, updateFn: UpdateFn, ...args: any[]): T // variadic forms export function assoc(obj: T, path: Key[] | Key, value: any, path2: Key[] | Key, value2: any ): T export function assoc(obj: T, path: Key[] | Key, value: any, path2: Key[] | Key, value2: any, path3: Key[] | Key, value3: any, ): T export function assoc(obj: T, path: Key[] | Key, value: any, path2: Key[] | Key, value2: any, path3: Key[] | Key, value3: any, ...args: Array ): T export function dissoc(obj: T, ...paths: Array): T