@@ -62,12 +62,34 @@ let typeMap: {[index: string]: any} = {
62
62
{{#models} }
63
63
{ {#model} }
64
64
{ {^isEnum} }
65
+ { {^discriminator} }
65
66
"{ {classname} }": { {classname} },
67
+ { {/discriminator} }
66
68
{ {/isEnum} }
67
69
{ {/model} }
68
70
{ {/models} }
69
71
}
70
72
73
+ let unionMap: { [index: string]: {discriminator: string, mapping: Record< string, string> } } = {
74
+ {{#models} }
75
+ { {#model} }
76
+ { {^isEnum} }
77
+ { {#discriminator} }
78
+ "{ {classname} }": {
79
+ " discriminator" : " {{discriminator.propertyName}}" ,
80
+ " mapping" : {
81
+ {{#mappedModels} }
82
+ "{ {mappingName} }": "{ {modelName} }",
83
+ { {/mappedModels} }
84
+ }
85
+ },
86
+ { {/discriminator} }
87
+ { {/isEnum} }
88
+ { {/model} }
89
+ { {/models} }
90
+ }
91
+
92
+
71
93
export class ObjectSerializer {
72
94
public static findCorrectType(data: any, expectedType: string) {
73
95
if (data == undefined) {
@@ -81,24 +103,36 @@ export class ObjectSerializer {
81
103
return expectedType;
82
104
}
83
105
84
- if (!typeMap[expectedType]) {
106
+ if (!typeMap[expectedType] && !unionMap[expectedType] ) {
85
107
return expectedType; // w/e we don' t know the type
86
108
}
87
109
88
- // Check the discriminator
89
- let discriminatorProperty = typeMap[expectedType].discriminator;
90
- if (discriminatorProperty == null) {
91
- return expectedType; // the type does not have a discriminator. use it.
110
+ if (unionMap[expectedType]) {
111
+ const discriminator = unionMap[expectedType];
112
+ let discriminatorValue = data[discriminator.discriminator];
113
+ if (discriminatorValue && discriminator.mapping[discriminatorValue]) {
114
+ // found a subclass
115
+ return discriminator.mapping[discriminatorValue];
116
+ } else if (discriminatorValue && typeMap[discriminatorValue]) {
117
+ // legacy fallback behavior
118
+ return typeMap[discriminatorValue];
119
+ }
92
120
} else {
93
- if (data[discriminatorProperty]) {
94
- var discriminatorType = data[discriminatorProperty];
95
- if(typeMap[discriminatorType]){
96
- return discriminatorType; // use the type given in the discriminator
121
+ // Check the discriminator
122
+ let discriminatorProperty = typeMap[expectedType].discriminator;
123
+ if (discriminatorProperty == null) {
124
+ return expectedType; // the type does not have a discriminator. use it.
125
+ } else {
126
+ if (data[discriminatorProperty]) {
127
+ var discriminatorType = data[discriminatorProperty];
128
+ if(typeMap[discriminatorType]){
129
+ return discriminatorType; // use the type given in the discriminator
130
+ } else {
131
+ return expectedType; // discriminator did not map to a type
132
+ }
97
133
} else {
98
- return expectedType; // discriminator did not map to a type
134
+ return expectedType; // discriminator was not present (or an empty string)
99
135
}
100
- } else {
101
- return expectedType; // discriminator was not present (or an empty string)
102
136
}
103
137
}
104
138
}
0 commit comments