ts-options-defaults
Object.assign({}, defaults, options)
and equivalent with destructing {...defaults, ...options}
come with a pitfall of creating only a shallow copy. Lodash _.merge
works on deep properties, but it merges arrays and that usually makes no sense in the context of default options (also it mutates first element; this package doesn't). This package fixes that problem - it merges objects deeply and overrides arrays. Also result remains strongly typed.
Options-defaults design pattern implementation for reliable configuration.
Usage
npm i ts-options-defaults
Design pattern
import { defaults } from 'ts-options-defaults';
export interface ISomeOptions {
logger?: Partial<Console>;
path: string;
}
export class Something {
static defaults: Required<ISomeOptions> = {
logger: console,
};
constructor(public options: IRatOptions) {
this.options = defaults({}, Rat.defaults, options);
}
}
Behavior
import { defaults } from 'ts-options-defaults';
const someDefaults = {
some: {
nested: {
property: 'default',
shouldStay: 'default',
array: ['default1', 'default2'],
},
},
array: ['default'],
};
const someOptionsOne = {
some: {
nested: {
property: 'overriden',
array: ['overriden1'],
},
},
array: ['overriden'],
};
const someOptionsTwo = {
justAddingThisOne: true,
};
const options = defaults(someDefaults, someOptionsOne, someOptionsTwo);