-
Notifications
You must be signed in to change notification settings - Fork 0
/
chart-series.example.ts
73 lines (64 loc) · 1.41 KB
/
chart-series.example.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
71
72
73
import { BaseType, plainToClass, Serializable } from '../serializable';
import { Type } from 'class-transformer';
abstract class ChartSeries {
type: string; // unique type
print(str?: string): void {
console.log(
`${str || ''}`,
`accept ${this.type}`,
`constructor.name ${this.constructor.name}`,
);
}
}
@Serializable({
discriminator: { key: 'type', value: 'line' },
})
class LineChartSeries extends ChartSeries {
type: 'line' = 'line';
print(): void {
super.print('____LINE____');
}
}
@Serializable({
// discriminator by custom function
discriminatorFn: (x: BarChartSeries) => x.type === 'bar',
})
class BarChartSeries extends ChartSeries {
type: 'bar' = 'bar';
print(): void {
super.print('____BAR____');
}
}
class Transition {
type: 'fade' | 'blur';
duration: number;
}
class ChartConfig {
@Type(() => Transition)
transition: Transition;
// here we indicate the base class
@BaseType(() => ChartSeries)
series: ChartSeries[];
}
const plainObject = {
transition: {
type: 'fade',
duration: 200,
},
series: [
{
type: 'line',
},
{
type: 'bar',
},
],
};
export const chartSeriesExample = () => {
const instance = plainToClass<ChartConfig>(ChartConfig, plainObject);
instance.series.map((series) => series.print());
console.log(
'Transition instanceof',
instance.transition instanceof Transition,
);
};