-
-
Notifications
You must be signed in to change notification settings - Fork 189
/
Configurable.ts
35 lines (34 loc) · 1.16 KB
/
Configurable.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
export type Constructor<T> = {
new (...args: any[]): T;
};
/**
* Configurable helper extends base type and makes all properties available as option bag arguments
* @internal
* @param base
*/
export function Configurable<T extends Constructor<{}>>(base: T): T {
return class extends base {
public assign(props: Partial<T>) {
//set the value of every property that was passed in,
//if the constructor previously set this value, it will be overridden here
for (const k in props) {
// eslint-disable-next-line
if (typeof (<any>this)[k] !== 'function') {
// eslint-disable-next-line
(<any>this)[k] = (<any>props)[k];
}
}
}
constructor(...args: any[]) {
super(...args);
//get the number of arguments that aren't undefined. TS passes a value to all parameters
//of whatever ctor is the implementation, so args.length doesn't work here.
const size = args.filter(function(value) {
return value !== undefined;
}).length;
if (size === 1 && args[0] && typeof args[0] === 'object' && !(args[0] instanceof Array)) {
this.assign(args[0]);
}
}
};
}