Support unions of classes and maps by making them maps
This commit is contained in:
Родитель
d58ab2c563
Коммит
24c739fbe9
|
@ -60,11 +60,15 @@ class UnifyUnionBuilder extends UnionBuilder<TypeBuilder & TypeLookerUp, TypeRef
|
|||
}
|
||||
|
||||
protected makeClass(classes: TypeRef[], maps: TypeRef[]): TypeRef {
|
||||
if (classes.length > 0 && maps.length > 0) {
|
||||
return panic("Cannot handle a class type that's also a map");
|
||||
}
|
||||
if (maps.length > 0) {
|
||||
return this.typeBuilder.getMapType(this._unifyTypes(maps, this.typeAttributes), this.forwardingRef);
|
||||
const propertyTypes = maps.slice();
|
||||
for (let classRef of classes) {
|
||||
const c = assertIsClass(classRef.deref()[0]);
|
||||
c.properties.forEach(cp => {
|
||||
propertyTypes.push(cp.typeRef);
|
||||
});
|
||||
}
|
||||
return this.typeBuilder.getMapType(this._unifyTypes(propertyTypes, this.typeAttributes), this.forwardingRef);
|
||||
}
|
||||
if (classes.length === 1) {
|
||||
return this.typeBuilder.lookupTypeRef(classes[0]);
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"union": {
|
||||
"foo": 3.1415
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"union": {
|
||||
"bar": "abc"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"union": {
|
||||
"foo": true,
|
||||
"bar": false
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"union": {
|
||||
"foo": {
|
||||
"quux": 123
|
||||
},
|
||||
"bar": {
|
||||
"quux": 456
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"union": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"foo": {
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"bar": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"quux": {
|
||||
"type": "integer"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче