@@ -83,18 +83,29 @@ export default function generateTypesV3(input: OpenAPI3 | OpenAPI3Schemas, optio
83
83
let properties = createKeys ( node . properties || { } , node . required ) ;
84
84
85
85
// if additional properties, add an intersection with a generic map type
86
- const additionalProperties = node . additionalProperties
87
- ? [
88
- `{ [key: string]: ${
89
- node . additionalProperties === true ? "any" : transform ( node . additionalProperties ) || "any"
90
- } ;}\n`,
91
- ]
92
- : [ ] ;
86
+ let additionalProperties : string | undefined ;
87
+ if ( node . additionalProperties ) {
88
+ if ( node . additionalProperties === true ) {
89
+ additionalProperties = `{ [key: string]: any }\n` ;
90
+ } else if ( typeof node . additionalProperties === "object" ) {
91
+ const oneOf : any [ ] | undefined = ( node . additionalProperties as any ) . oneOf || undefined ; // TypeScript does a really bad job at inference here, so we enforce a type
92
+ const anyOf : any [ ] | undefined = ( node . additionalProperties as any ) . anyOf || undefined ; // "
93
+ if ( oneOf ) {
94
+ additionalProperties = `{ [key: string]: ${ tsUnionOf ( oneOf . map ( transform ) ) } ; }\n` ;
95
+ } else if ( anyOf ) {
96
+ additionalProperties = `{ [key: string]: ${ tsIntersectionOf (
97
+ anyOf . map ( ( s ) => tsPartial ( transform ( s ) ) )
98
+ ) } ; }\n`;
99
+ } else {
100
+ additionalProperties = `{ [key: string]: ${ transform ( node . additionalProperties ) || "any" } ; }\n` ;
101
+ }
102
+ }
103
+ }
93
104
94
105
return tsIntersectionOf ( [
95
106
...( node . allOf ? ( node . allOf as any [ ] ) . map ( transform ) : [ ] ) , // append allOf first
96
107
...( properties ? [ `{ ${ properties } }` ] : [ ] ) , // then properties
97
- ...additionalProperties , // then additional properties
108
+ ...( additionalProperties ? [ additionalProperties ] : [ ] ) , // then additional properties
98
109
] ) ;
99
110
}
100
111
case "array" : {
0 commit comments