1
0
Fork 0
functional/objects.ts

29 lines
747 B
TypeScript

// Attribute getter
export function attr<K extends string>(
name: K,
): <O extends Record<K, O[K]>>(obj: O) => O[K] {
return (obj) => obj[name];
}
type DefinedKeys<T> =
({ [P in keyof T]: T[P] extends undefined ? never : P })[keyof T];
type Defined<T> = Pick<T, DefinedKeys<T>>;
// Removes undefined values from objects
export function defined<T>(obj: T): Defined<T> {
return Object.fromEntries(
Object.entries(obj).filter(([_, value]) => typeof value !== "undefined"),
) as any;
}
// Apply options to a default object
export function options<T extends { [name: string]: any }>(
defaults: T,
...options: Partial<T>[]
) {
for (let opts of options) {
defaults = { ...defaults, ...defined(opts) };
}
return defaults;
}