29 lines
747 B
TypeScript
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;
|
|
}
|