-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBuilder.ts
70 lines (56 loc) · 1.2 KB
/
Builder.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Builder {
static builder(builder) {
return new Builder(builder);
}
$$type;
constructor(object = {}) {
for (const key in object) {
if (Object.hasOwnProperty.call(object, key)) {
this[key] = object[key];
}
}
}
withType(type) {
this.$$type = type;
return this;
}
fromJson(object = {}) {
const objectKeys = Object.keys(object);
for (let index = 0; index < objectKeys.length; index++) {
const key = objectKeys[index];
if (this[key] && this[key] === object[key]) {
continue;
}
this[key] = object[key];
}
return this;
}
toJson() {
return Object.keys(this).reduce((acc, key) => {
acc[key] = this[key];
return acc;
}, {});
}
}
class Car extends Builder {
color;
setColor(color) {
this.color = color;
return this;
}
}
class Motobike extends Builder {
color: string;
setColor(color) {
this.color = color;
return this;
}
}
const car = new Car({ of: 'tanna' })
.withType('@builder/car')
.setColor('black-pink');
console.log(car);
const motobike = new Motobike({ of: 'tanna' })
.withType('@builder/motobike')
.setColor('yellow');
console.log(motobike);