Skip to content

Commit

Permalink
fix: typescript rendering wrong array type when union (#928)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonaslagoni authored Oct 5, 2022
1 parent 7b8612b commit 65c9474
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 29 deletions.
6 changes: 5 additions & 1 deletion src/generators/typescript/TypeScriptConstrainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,11 @@ export const TypeScriptDefaultTypeMapping: TypeMapping<TypeScriptOptions> = {
return `[${tupleTypes.join(', ')}]`;
},
Array ({constrainedModel}): string {
return `${constrainedModel.valueModel.type}[]`;
let arrayType = constrainedModel.valueModel.type;
if (constrainedModel.valueModel instanceof ConstrainedUnionModel) {
arrayType = `(${arrayType})`;
}
return `${arrayType}[]`;
},
Enum ({constrainedModel}): string {
return constrainedModel.name;
Expand Down
8 changes: 8 additions & 0 deletions test/generators/typescript/TypeScriptConstrainer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ describe('TypeScriptConstrainer', () => {
const type = TypeScriptDefaultTypeMapping.Array({constrainedModel: model, options: TypeScriptGenerator.defaultOptions});
expect(type).toEqual('String[]');
});
test('should render union types correctly', () => {
const stringModel = new ConstrainedStringModel('test', undefined, 'String');
const anyModel = new ConstrainedAnyModel('test', undefined, 'any');
const unionModel = new ConstrainedUnionModel('test', undefined, 'String | any', [anyModel, stringModel]);
const model = new ConstrainedArrayModel('test', undefined, '', unionModel);
const type = TypeScriptDefaultTypeMapping.Array({constrainedModel: model, options: TypeScriptGenerator.defaultOptions});
expect(type).toEqual('(String | any)[]');
});
});

describe('Enum', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,8 @@ exports[`TypeScriptGenerator should render \`class\` type 1`] = `
private _marriage?: boolean;
private _members?: string | number | boolean;
private _tupleType?: [string, number];
private _tupleTypeWithAdditionalItems?: string | number | any[];
private _arrayType: string | any[];
private _tupleTypeWithAdditionalItems?: (string | number | any)[];
private _arrayType: (string | any)[];
private _additionalProperties?: Map<string, any>;
constructor(input: {
Expand All @@ -139,8 +139,8 @@ exports[`TypeScriptGenerator should render \`class\` type 1`] = `
marriage?: boolean,
members?: string | number | boolean,
tupleType?: [string, number],
tupleTypeWithAdditionalItems?: string | number | any[],
arrayType: string | any[],
tupleTypeWithAdditionalItems?: (string | number | any)[],
arrayType: (string | any)[],
additionalProperties?: Map<string, any>,
}) {
this._streetName = input.streetName;
Expand Down Expand Up @@ -176,11 +176,11 @@ exports[`TypeScriptGenerator should render \`class\` type 1`] = `
get tupleType(): [string, number] | undefined { return this._tupleType; }
set tupleType(tupleType: [string, number] | undefined) { this._tupleType = tupleType; }
get tupleTypeWithAdditionalItems(): string | number | any[] | undefined { return this._tupleTypeWithAdditionalItems; }
set tupleTypeWithAdditionalItems(tupleTypeWithAdditionalItems: string | number | any[] | undefined) { this._tupleTypeWithAdditionalItems = tupleTypeWithAdditionalItems; }
get tupleTypeWithAdditionalItems(): (string | number | any)[] | undefined { return this._tupleTypeWithAdditionalItems; }
set tupleTypeWithAdditionalItems(tupleTypeWithAdditionalItems: (string | number | any)[] | undefined) { this._tupleTypeWithAdditionalItems = tupleTypeWithAdditionalItems; }
get arrayType(): string | any[] { return this._arrayType; }
set arrayType(arrayType: string | any[]) { this._arrayType = arrayType; }
get arrayType(): (string | any)[] { return this._arrayType; }
set arrayType(arrayType: (string | any)[]) { this._arrayType = arrayType; }
get additionalProperties(): Map<string, any> | undefined { return this._additionalProperties; }
set additionalProperties(additionalProperties: Map<string, any> | undefined) { this._additionalProperties = additionalProperties; }
Expand All @@ -206,15 +206,15 @@ exports[`TypeScriptGenerator should render \`interface\` type 1`] = `
marriage?: boolean;
members?: string | number | boolean;
tupleType?: [string, number];
tupleTypeWithAdditionalItems?: string | number | any[];
arrayType: string | any[];
tupleTypeWithAdditionalItems?: (string | number | any)[];
arrayType: (string | any)[];
additionalProperties?: Map<string, any>;
}"
`;

exports[`TypeScriptGenerator should render \`type\` type - array of primitive type 1`] = `"type TypeArray = string | any[];"`;
exports[`TypeScriptGenerator should render \`type\` type - array of primitive type 1`] = `"type TypeArray = (string | any)[];"`;

exports[`TypeScriptGenerator should render \`type\` type - array of union type 1`] = `"type TypeArray = string | number | boolean | any[];"`;
exports[`TypeScriptGenerator should render \`type\` type - array of union type 1`] = `"type TypeArray = (string | number | boolean | any)[];"`;

exports[`TypeScriptGenerator should render \`type\` type - enum 1`] = `
"enum TypeEnum {
Expand Down Expand Up @@ -251,7 +251,7 @@ class Address {
private _houseNumber: number;
private _marriage?: boolean;
private _members?: string | number | boolean;
private _arrayType: string | number | any[];
private _arrayType: (string | number | any)[];
private _otherModel?: OtherModel;
private _additionalProperties?: Map<string, any>;
Expand All @@ -262,7 +262,7 @@ class Address {
houseNumber: number,
marriage?: boolean,
members?: string | number | boolean,
arrayType: string | number | any[],
arrayType: (string | number | any)[],
otherModel?: OtherModel,
additionalProperties?: Map<string, any>,
}) {
Expand Down Expand Up @@ -295,8 +295,8 @@ class Address {
get members(): string | number | boolean | undefined { return this._members; }
set members(members: string | number | boolean | undefined) { this._members = members; }
get arrayType(): string | number | any[] { return this._arrayType; }
set arrayType(arrayType: string | number | any[]) { this._arrayType = arrayType; }
get arrayType(): (string | number | any)[] { return this._arrayType; }
set arrayType(arrayType: (string | number | any)[]) { this._arrayType = arrayType; }
get otherModel(): OtherModel | undefined { return this._otherModel; }
set otherModel(otherModel: OtherModel | undefined) { this._otherModel = otherModel; }
Expand Down Expand Up @@ -339,7 +339,7 @@ class Address {
private _houseNumber: number;
private _marriage?: boolean;
private _members?: string | number | boolean;
private _arrayType: string | number | any[];
private _arrayType: (string | number | any)[];
private _otherModel?: OtherModel;
private _additionalProperties?: Map<string, any>;
Expand All @@ -350,7 +350,7 @@ class Address {
houseNumber: number,
marriage?: boolean,
members?: string | number | boolean,
arrayType: string | number | any[],
arrayType: (string | number | any)[],
otherModel?: OtherModel,
additionalProperties?: Map<string, any>,
}) {
Expand Down Expand Up @@ -383,8 +383,8 @@ class Address {
get members(): string | number | boolean | undefined { return this._members; }
set members(members: string | number | boolean | undefined) { this._members = members; }
get arrayType(): string | number | any[] { return this._arrayType; }
set arrayType(arrayType: string | number | any[]) { this._arrayType = arrayType; }
get arrayType(): (string | number | any)[] { return this._arrayType; }
set arrayType(arrayType: (string | number | any)[]) { this._arrayType = arrayType; }
get otherModel(): OtherModel | undefined { return this._otherModel; }
set otherModel(otherModel: OtherModel | undefined) { this._otherModel = otherModel; }
Expand Down Expand Up @@ -427,7 +427,7 @@ class Address {
private _houseNumber: number;
private _marriage?: boolean;
private _members?: string | number | boolean;
private _arrayType: string | number | any[];
private _arrayType: (string | number | any)[];
private _otherModel?: OtherModel;
private _additionalProperties?: Map<string, any>;
Expand All @@ -438,7 +438,7 @@ class Address {
houseNumber: number,
marriage?: boolean,
members?: string | number | boolean,
arrayType: string | number | any[],
arrayType: (string | number | any)[],
otherModel?: OtherModel,
additionalProperties?: Map<string, any>,
}) {
Expand Down Expand Up @@ -471,8 +471,8 @@ class Address {
get members(): string | number | boolean | undefined { return this._members; }
set members(members: string | number | boolean | undefined) { this._members = members; }
get arrayType(): string | number | any[] { return this._arrayType; }
set arrayType(arrayType: string | number | any[]) { this._arrayType = arrayType; }
get arrayType(): (string | number | any)[] { return this._arrayType; }
set arrayType(arrayType: (string | number | any)[]) { this._arrayType = arrayType; }
get otherModel(): OtherModel | undefined { return this._otherModel; }
set otherModel(otherModel: OtherModel | undefined) { this._otherModel = otherModel; }
Expand Down Expand Up @@ -517,7 +517,7 @@ export class Address {
private _houseNumber: number;
private _marriage?: boolean;
private _members?: string | number | boolean;
private _arrayType: string | number | any[];
private _arrayType: (string | number | any)[];
private _otherModel?: OtherModel;
private _additionalProperties?: Map<string, any>;
Expand All @@ -528,7 +528,7 @@ export class Address {
houseNumber: number,
marriage?: boolean,
members?: string | number | boolean,
arrayType: string | number | any[],
arrayType: (string | number | any)[],
otherModel?: OtherModel,
additionalProperties?: Map<string, any>,
}) {
Expand Down Expand Up @@ -561,8 +561,8 @@ export class Address {
get members(): string | number | boolean | undefined { return this._members; }
set members(members: string | number | boolean | undefined) { this._members = members; }
get arrayType(): string | number | any[] { return this._arrayType; }
set arrayType(arrayType: string | number | any[]) { this._arrayType = arrayType; }
get arrayType(): (string | number | any)[] { return this._arrayType; }
set arrayType(arrayType: (string | number | any)[]) { this._arrayType = arrayType; }
get otherModel(): OtherModel | undefined { return this._otherModel; }
set otherModel(otherModel: OtherModel | undefined) { this._otherModel = otherModel; }
Expand Down

0 comments on commit 65c9474

Please sign in to comment.