@@ -83,18 +83,29 @@ export default function generateTypesV3(input: OpenAPI3 | OpenAPI3Schemas, optio
8383 let properties = createKeys ( node . properties || { } , node . required ) ;
8484
8585 // 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+ }
93104
94105 return tsIntersectionOf ( [
95106 ...( node . allOf ? ( node . allOf as any [ ] ) . map ( transform ) : [ ] ) , // append allOf first
96107 ...( properties ? [ `{ ${ properties } }` ] : [ ] ) , // then properties
97- ...additionalProperties , // then additional properties
108+ ...( additionalProperties ? [ additionalProperties ] : [ ] ) , // then additional properties
98109 ] ) ;
99110 }
100111 case "array" : {
0 commit comments