diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/NullabilityTests.cs b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/NullabilityTests.cs index 347c666e9..a0bff8848 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/NullabilityTests.cs +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/NullabilityTests.cs @@ -186,5 +186,38 @@ public void When_array_item_is_nullable_then_generated_TypeScript_is_correct() Assert.True(schema.Properties["Items"].Item.IsNullable(SchemaType.JsonSchema)); Assert.Contains(": (string | null)[]", output); } + + public class Complex + { + public int A { get; set; } + } + + public class ClassWithComplexNullableArrayItems + { + [NotNull] + [ItemsCanBeNull] + public List Items { get; set; } + } + + [Fact] + public void When_complex_array_item_is_nullable_then_generated_TypeScript_is_nullsafe() + { + // Arrange + var schema = NewtonsoftJsonSchemaGenerator.FromType(); + var json = schema.ToJson(); + var generator = new TypeScriptGenerator(schema, new TypeScriptGeneratorSettings + { + TypeScriptVersion = 2.7m, + NullValue = TypeScriptNullValue.Null + }); + + // Act + var output = generator.GenerateFile("MyClass"); + + // Assert + Assert.True(schema.Properties["Items"].Item.IsNullable(SchemaType.JsonSchema)); + Assert.Contains(": (Complex | null)[]", output); + Assert.Contains(".push(item ? item.toJSON() : null)", output); + } } } diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=1.8.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=1.8.verified.txt index 3f470a61a..e9b392e5d 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=1.8.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=1.8.verified.txt @@ -188,7 +188,7 @@ export class MyClass implements IMyClass { if (Array.isArray(this.array)) { data["Array"] = []; for (let item of this.array) - data["Array"].push(item.toJSON()); + data["Array"].push(item ? item.toJSON() : undefined); } if (this.dictionary) { data["Dictionary"] = {}; diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=2.1.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=2.1.verified.txt index 47f8a76ad..cf83ffc9e 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=2.1.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=2.1.verified.txt @@ -188,7 +188,7 @@ export class MyClass implements IMyClass { if (Array.isArray(this.array)) { data["Array"] = []; for (let item of this.array) - data["Array"].push(item.toJSON()); + data["Array"].push(item ? item.toJSON() : undefined); } if (this.dictionary) { data["Dictionary"] = {}; diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=2.7.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=2.7.verified.txt index 7261c16a6..89034c76d 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=2.7.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=2.7.verified.txt @@ -188,7 +188,7 @@ export class MyClass implements IMyClass { if (Array.isArray(this.array)) { data["Array"] = []; for (let item of this.array) - data["Array"].push(item.toJSON()); + data["Array"].push(item ? item.toJSON() : undefined); } if (this.dictionary) { data["Dictionary"] = {}; diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=4.3.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=4.3.verified.txt index d3cf435ab..0a5802c2b 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=4.3.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=Class_version=4.3.verified.txt @@ -188,7 +188,7 @@ export class MyClass implements IMyClass { if (Array.isArray(this.array)) { data["Array"] = []; for (let item of this.array) - data["Array"].push(item.toJSON()); + data["Array"].push(item ? item.toJSON() : undefined); } if (this.dictionary) { data["Dictionary"] = {}; diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=1.8.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=1.8.verified.txt index 40c378a7d..df0e0fa7c 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=1.8.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=1.8.verified.txt @@ -214,7 +214,7 @@ export class MyClass { if (Array.isArray(array_)) { data["Array"] = []; for (let item of array_) - data["Array"].push(item.toJSON()); + data["Array"].push(item ? item.toJSON() : undefined); } let dictionary_: any = this.dictionary(); diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=2.1.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=2.1.verified.txt index f5426fd89..eb952b327 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=2.1.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=2.1.verified.txt @@ -214,7 +214,7 @@ export class MyClass { if (Array.isArray(array_)) { data["Array"] = []; for (let item of array_) - data["Array"].push(item.toJSON()); + data["Array"].push(item ? item.toJSON() : undefined); } let dictionary_: any = this.dictionary(); diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=2.7.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=2.7.verified.txt index 597c5cc2f..40f094648 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=2.7.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=2.7.verified.txt @@ -214,7 +214,7 @@ export class MyClass { if (Array.isArray(array_)) { data["Array"] = []; for (let item of array_) - data["Array"].push(item.toJSON()); + data["Array"].push(item ? item.toJSON() : undefined); } let dictionary_: any = this.dictionary(); diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=4.3.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=4.3.verified.txt index 1a67d9e52..2b3c14a4a 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=4.3.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/ClassGenerationTests.Verify_output_style=KnockoutClass_version=4.3.verified.txt @@ -214,7 +214,7 @@ export class MyClass { if (Array.isArray(array_)) { data["Array"] = []; for (let item of array_) - data["Array"].push(item.toJSON()); + data["Array"].push(item ? item.toJSON() : undefined); } let dictionary_: any = this.dictionary(); diff --git a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/TypeScriptDiscriminatorTests.When_parameter_is_abstract_then_generate_union_class.verified.txt b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/TypeScriptDiscriminatorTests.When_parameter_is_abstract_then_generate_union_class.verified.txt index fa8a3a3f1..56b865ff8 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/TypeScriptDiscriminatorTests.When_parameter_is_abstract_then_generate_union_class.verified.txt +++ b/src/NJsonSchema.CodeGeneration.TypeScript.Tests/Snapshots/TypeScriptDiscriminatorTests.When_parameter_is_abstract_then_generate_union_class.verified.txt @@ -169,7 +169,7 @@ export class MyClass implements IMyClass { if (Array.isArray(this.children)) { data["Children"] = []; for (let item of this.children) - data["Children"].push(item.toJSON()); + data["Children"].push(item ? item.toJSON() : undefined); } return data; } diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/Templates/ConvertToJavaScript.liquid b/src/NJsonSchema.CodeGeneration.TypeScript/Templates/ConvertToJavaScript.liquid index 7660ce78d..6e829e570 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/Templates/ConvertToJavaScript.liquid +++ b/src/NJsonSchema.CodeGeneration.TypeScript/Templates/ConvertToJavaScript.liquid @@ -5,7 +5,7 @@ if (Array.isArray({{ Value }})) { {{ Variable }} = []; for (let item of {{ Value }}) {%- if IsArrayItemNewableObject -%} - {{ Variable }}.push(item.toJSON()); + {{ Variable }}.push(item ? item.toJSON() : {{ NullValue }}); {%- elsif IsArrayItemDate -%} {{ Variable }}.push({% if UseJsDate %}formatDate(item){% else %}item.{{ DateToStringCode }}{% endif %}); {%- elsif IsArrayItemDateTime -%}