diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java index 29ceed98f88..cc5a4d31921 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -629,7 +629,11 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { Schema items = ModelUtils.getSchemaItems(p); - return getSchemaType(p) + "<" + getTypeDeclaration(unaliasSchema(items)) + ">"; + String postfix = ""; + if (Boolean.TRUE.equals(items.getNullable())) { + postfix = " | null"; + } + return getSchemaType(p) + "<" + getTypeDeclaration(unaliasSchema(items)) + postfix + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = getSchemaAdditionalProperties(p); String nullSafeSuffix = getNullSafeAdditionalProps() ? " | undefined" : ""; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java index 7b1e9804e1d..a07142fa1ff 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java @@ -458,12 +458,8 @@ public class TypeScriptClientCodegen extends AbstractTypeScriptClientCodegen imp @Override public String getTypeDeclaration(Schema p) { - Schema inner; - if (ModelUtils.isArraySchema(p)) { - inner = ModelUtils.getSchemaItems(p); - return this.getSchemaType(p) + "<" + this.getTypeDeclaration(unaliasSchema(inner)) + ">"; - } else if (ModelUtils.isMapSchema(p)) { - inner = getSchemaAdditionalProperties(p); + if (ModelUtils.isMapSchema(p)) { + Schema inner = getSchemaAdditionalProperties(p); String postfix = ""; if (Boolean.TRUE.equals(inner.getNullable())) { postfix = " | null"; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java index 28b7d136d16..73ce991ffaf 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java @@ -804,10 +804,6 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege newItemsDataType = "string"; var.dataTypeAlternate = var.dataTypeAlternate.replace("number", newItemsDataType); } - - if (var.itemsAreNullable()) { - var.dataTypeAlternate = var.dataTypeAlternate.replace(newItemsDataType, newItemsDataType + " | null"); - } } else if (var.isEnum) { var.dataTypeAlternate = var.datatypeWithEnum; } else if (var.isModel) { @@ -825,10 +821,6 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege return parentIsEntity; } - private boolean itemsAreNullable(ExtendedCodegenProperty var) { - return var.items.isNullable || (var.items.items != null && var.items.items.isNullable); - } - private void escapeOperationIds(OperationsMap operations) { for (CodegenOperation _op : operations.getOperations().getOperation()) { ExtendedCodegenOperation op = (ExtendedCodegenOperation) _op; @@ -925,10 +917,6 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege newItemsDataType = "string"; param.dataTypeAlternate = param.dataTypeAlternate.replace("number", newItemsDataType); } - - if (param.itemsAreNullable()) { - param.dataTypeAlternate = param.dataTypeAlternate.replace(newItemsDataType, newItemsDataType + " | null"); - } } else if (param.isEnum) { param.dataTypeAlternate = param.datatypeWithEnum; } else if (param.isModel) { @@ -1022,16 +1010,6 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege return false; } - private static boolean itemsAreNullable(CodegenProperty items) { - if (items == null) { - return true; - } - if (items.items != null) { - return itemsAreNullable(items.items); - } - return items.isNullable; - } - private static String getItemsDataType(CodegenProperty items) { if (items == null) { return null; @@ -1052,10 +1030,6 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege return TypeScriptFetchClientCodegen.itemsAreUniqueId(this.items); } - public boolean itemsAreNullable() { - return TypeScriptFetchClientCodegen.itemsAreNullable(this.items); - } - public String getItemsDataType() { return TypeScriptFetchClientCodegen.getItemsDataType(this.items); } @@ -1206,10 +1180,6 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege return TypeScriptFetchClientCodegen.itemsAreUniqueId(this.items); } - public boolean itemsAreNullable() { - return TypeScriptFetchClientCodegen.itemsAreNullable(this.items); - } - public String getItemsDataType() { return TypeScriptFetchClientCodegen.getItemsDataType(this.items); } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/TypeScriptClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/TypeScriptClientCodegenTest.java index f58571df9b7..0c1cd296d18 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/TypeScriptClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/TypeScriptClientCodegenTest.java @@ -157,4 +157,15 @@ public class TypeScriptClientCodegenTest { Assert.fail("Exception was thrown."); } } + + @Test + public void arrayItemsCanBeNullable() throws Exception { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/array-nullable-items.yaml"); + final DefaultCodegen codegen = new TypeScriptClientCodegen(); + codegen.setOpenAPI(openAPI); + final ArraySchema schema = (ArraySchema) openAPI.getComponents().getSchemas().get("ArrayWithNullableItemsModel") + .getProperties() + .get("foo"); + Assert.assertEquals(codegen.getTypeDeclaration(schema), "Array"); + } } diff --git a/samples/client/petstore/typescript-axios/builds/test-petstore/api.ts b/samples/client/petstore/typescript-axios/builds/test-petstore/api.ts index 0ddbd60a7b7..9e6fbd62d62 100644 --- a/samples/client/petstore/typescript-axios/builds/test-petstore/api.ts +++ b/samples/client/petstore/typescript-axios/builds/test-petstore/api.ts @@ -1129,16 +1129,16 @@ export interface NullableClass { 'array_nullable_prop'?: Array | null; /** * - * @type {Array} + * @type {Array} * @memberof NullableClass */ - 'array_and_items_nullable_prop'?: Array | null; + 'array_and_items_nullable_prop'?: Array | null; /** * - * @type {Array} + * @type {Array} * @memberof NullableClass */ - 'array_items_nullable'?: Array; + 'array_items_nullable'?: Array; /** * * @type {{ [key: string]: object; }} diff --git a/samples/client/petstore/typescript-axios/builds/with-fake-endpoints-models-for-testing-with-http-signature/api.ts b/samples/client/petstore/typescript-axios/builds/with-fake-endpoints-models-for-testing-with-http-signature/api.ts index 255ec3ed0e3..84e27a4c705 100644 --- a/samples/client/petstore/typescript-axios/builds/with-fake-endpoints-models-for-testing-with-http-signature/api.ts +++ b/samples/client/petstore/typescript-axios/builds/with-fake-endpoints-models-for-testing-with-http-signature/api.ts @@ -857,16 +857,16 @@ export interface NullableClass { 'array_nullable_prop'?: Array | null; /** * - * @type {Array} + * @type {Array} * @memberof NullableClass */ - 'array_and_items_nullable_prop'?: Array | null; + 'array_and_items_nullable_prop'?: Array | null; /** * - * @type {Array} + * @type {Array} * @memberof NullableClass */ - 'array_items_nullable'?: Array; + 'array_items_nullable'?: Array; /** * * @type {{ [key: string]: object; }} diff --git a/samples/client/petstore/typescript-fetch/builds/default-v3.0/models/NullableClass.ts b/samples/client/petstore/typescript-fetch/builds/default-v3.0/models/NullableClass.ts index 3f13364442d..f20a3d1c509 100644 --- a/samples/client/petstore/typescript-fetch/builds/default-v3.0/models/NullableClass.ts +++ b/samples/client/petstore/typescript-fetch/builds/default-v3.0/models/NullableClass.ts @@ -64,16 +64,16 @@ export interface NullableClass { arrayNullableProp?: Array | null; /** * - * @type {Array} + * @type {Array} * @memberof NullableClass */ - arrayAndItemsNullableProp?: Array | null; + arrayAndItemsNullableProp?: Array | null; /** * - * @type {Array} + * @type {Array} * @memberof NullableClass */ - arrayItemsNullable?: Array; + arrayItemsNullable?: Array; /** * * @type {{ [key: string]: object; }} diff --git a/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/apis/PetApi.ts b/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/apis/PetApi.ts index a283bd47222..f1f83a90663 100644 --- a/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/apis/PetApi.ts +++ b/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/apis/PetApi.ts @@ -76,7 +76,7 @@ export interface UpdatePetRequest { export interface UpdatePetRegionsRequest { petId: number; - newRegions: Array>; + newRegions: Array>; } export interface UpdatePetWithFormRequest { @@ -509,7 +509,7 @@ export class PetApi extends runtime.BaseAPI { /** * Updates the pet regions. */ - async updatePetRegions(petId: number, newRegions: Array>, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + async updatePetRegions(petId: number, newRegions: Array>, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { const response = await this.updatePetRegionsRaw({ petId: petId, newRegions: newRegions }, initOverrides); return await response.value(); } diff --git a/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/models/Pet.ts b/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/models/Pet.ts index 35c173b55b3..b867676a4c9 100644 --- a/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/models/Pet.ts +++ b/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/models/Pet.ts @@ -166,10 +166,10 @@ export interface Pet { status: PetStatusEnum; /** * An array of all 15-minute time slots in 24 hours. - * @type {Array>} + * @type {Array>} * @memberof Pet */ - regions?: Array>; + regions?: Array>; } diff --git a/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/models/PetRegionsResponse.ts b/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/models/PetRegionsResponse.ts index 8430854a46c..be15dff74a1 100644 --- a/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/models/PetRegionsResponse.ts +++ b/samples/client/petstore/typescript-fetch/builds/sagas-and-records/src/models/PetRegionsResponse.ts @@ -34,10 +34,10 @@ export interface PetRegionsResponse { meta: ResponseMeta; /** * An array of all 15-minute time slots in 24 hours. - * @type {Array>} + * @type {Array>} * @memberof PetRegionsResponse */ - data?: Array>; + data?: Array>; } /** diff --git a/samples/client/petstore/typescript-fetch/builds/snakecase-discriminator/models/NullableClass.ts b/samples/client/petstore/typescript-fetch/builds/snakecase-discriminator/models/NullableClass.ts index 3f13364442d..f20a3d1c509 100644 --- a/samples/client/petstore/typescript-fetch/builds/snakecase-discriminator/models/NullableClass.ts +++ b/samples/client/petstore/typescript-fetch/builds/snakecase-discriminator/models/NullableClass.ts @@ -64,16 +64,16 @@ export interface NullableClass { arrayNullableProp?: Array | null; /** * - * @type {Array} + * @type {Array} * @memberof NullableClass */ - arrayAndItemsNullableProp?: Array | null; + arrayAndItemsNullableProp?: Array | null; /** * - * @type {Array} + * @type {Array} * @memberof NullableClass */ - arrayItemsNullable?: Array; + arrayItemsNullable?: Array; /** * * @type {{ [key: string]: object; }}