Obj (Object)
Property access (dual)
Section titled “Property access (dual)”pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>omit<T, K extends keyof T>(obj: T, keys: K[]): Omit<T, K>path<T, P extends string>(obj: T, path: P): PathValue<T, P> | undefinedpathOr<T, P extends string, D>(obj: T, path: P, defaultValue: D): PathValue<T, P> | DProperty mutation (dual, immutable)
Section titled “Property mutation (dual, immutable)”assoc<T, V>(obj: T, key: string, value: V): T & Record<string, V>dissoc<T>(obj: T, key: string): Partial<T>evolve<T>(obj: T, transformations: Partial<{ [K in keyof T]: (v: T[K]) => T[K] }>): TMerging (dual)
Section titled “Merging (dual)”mergeDeepLeft<T>(a: T, b: T): TmergeDeepRight<T>(a: T, b: T): TmergeWith<T, V>(a: T, b: T, resolver: (l: V, r: V) => V): TExamples
Section titled “Examples”import { pipe, Obj } from '@stopcock/fp'
// strip sensitive fields before sending to clientconst safe = pipe(user, Obj.omit(['password', 'ssn']))
// extract fields for a formconst formData = pipe(user, Obj.pick(['name', 'email', 'phone']))
// safe nested accesspipe(order, Obj.pathOr('shipping.address.zip', 'N/A'))
// immutable updatepipe(user, Obj.assoc('role', 'admin'))
// transform multiple fields at oncepipe( config, Obj.evolve({ port: (p: number) => p + 1, host: (h: string) => h.toLowerCase(), }),)
// deep merge with priorityconst merged = Obj.mergeDeepRight(defaults, userPrefs)