Skip to content

Commit 1655275

Browse files
authored
feat(typescript-angular): update enum definitions to use 'as const' for improved type safety (#20958)
fixes #20809
1 parent 07e5a67 commit 1655275

File tree

31 files changed

+173
-148
lines changed

31 files changed

+173
-148
lines changed

modules/openapi-generator/src/main/resources/typescript-angular/modelEnum.mustache

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ export enum {{classname}} {
1313
}
1414
{{/stringEnums}}
1515
{{^stringEnums}}
16-
export type {{classname}} = {{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}} | {{/-last}}{{/enumVars}}{{/allowableValues}};
17-
1816
export const {{classname}} = {
1917
{{#allowableValues}}
2018
{{#enumVars}}
2119
{{#enumDescription}}
2220

2321
/**
2422
* {{.}}
25-
*/{{/enumDescription}}
26-
{{name}}: {{{value}}} as {{classname}}{{^-last}},{{/-last}}
23+
*/
24+
{{/enumDescription}}
25+
{{name}}: {{{value}}}{{^-last}},{{/-last}}
2726
{{/enumVars}}
2827
{{/allowableValues}}
29-
};
28+
} as const;
29+
export type {{classname}} = typeof {{classname}}[keyof typeof {{classname}}];
3030
{{/stringEnums}}

modules/openapi-generator/src/main/resources/typescript-angular/modelGenericEnums.mustache

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ export enum {{classname}}{{enumName}} {
1515
};
1616
{{/stringEnums}}
1717
{{^stringEnums}}
18-
export type {{enumName}} = {{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}} | {{/-last}}{{/enumVars}}{{/allowableValues}};
1918
export const {{enumName}} = {
2019
{{#allowableValues}}
2120
{{#enumVars}}
22-
{{name}}: {{{value}}} as {{enumName}}{{^-last}},{{/-last}}
21+
{{name}}: {{{value}}}{{^-last}},{{/-last}}
2322
{{/enumVars}}
2423
{{/allowableValues}}
25-
};
24+
} as const;
25+
export type {{enumName}} = typeof {{enumName}}[keyof typeof {{enumName}}];
2626
{{/stringEnums}}
2727
{{/isEnum}}
2828
{{/vars}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/typescriptangular/TypeScriptAngularClientCodegenTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,4 +439,29 @@ public void testBasePath() throws IOException {
439439
final String fileContents = Files.readString(Paths.get(output + "/api.base.service.ts"));
440440
assertThat(fileContents).containsOnlyOnce("basePath = '/relative/url'");
441441
}
442+
443+
@Test
444+
public void testEnumAsConst() throws IOException {
445+
// GIVEN
446+
final String specPath = "src/test/resources/3_0/enum.yaml";
447+
448+
File output = Files.createTempDirectory("test").toFile();
449+
output.deleteOnExit();
450+
451+
// WHEN
452+
final CodegenConfigurator configurator = new CodegenConfigurator()
453+
.setGeneratorName("typescript-angular")
454+
.setInputSpec(specPath)
455+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
456+
457+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
458+
459+
Generator generator = new DefaultGenerator();
460+
generator.opts(clientOptInput).generate();
461+
462+
// THEN
463+
final String fileContents = Files.readString(Paths.get(output + "/model/type.ts"));
464+
assertThat(fileContents).containsOnlyOnce("} as const;");
465+
assertThat(fileContents).doesNotContain(" as Type");
466+
}
442467
}

samples/client/petstore/typescript-angular-v12-provided-in-any/builds/default/model/order.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export interface Order {
2424
complete?: boolean;
2525
}
2626
export namespace Order {
27-
export type StatusEnum = 'placed' | 'approved' | 'delivered';
2827
export const StatusEnum = {
29-
Placed: 'placed' as StatusEnum,
30-
Approved: 'approved' as StatusEnum,
31-
Delivered: 'delivered' as StatusEnum
32-
};
28+
Placed: 'placed',
29+
Approved: 'approved',
30+
Delivered: 'delivered'
31+
} as const;
32+
export type StatusEnum = typeof StatusEnum[keyof typeof StatusEnum];
3333
}
3434

3535

samples/client/petstore/typescript-angular-v12-provided-in-any/builds/default/model/pet.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ export interface Pet {
2626
status?: Pet.StatusEnum;
2727
}
2828
export namespace Pet {
29-
export type StatusEnum = 'available' | 'pending' | 'sold';
3029
export const StatusEnum = {
31-
Available: 'available' as StatusEnum,
32-
Pending: 'pending' as StatusEnum,
33-
Sold: 'sold' as StatusEnum
34-
};
30+
Available: 'available',
31+
Pending: 'pending',
32+
Sold: 'sold'
33+
} as const;
34+
export type StatusEnum = typeof StatusEnum[keyof typeof StatusEnum];
3535
}
3636

3737

samples/client/petstore/typescript-angular-v12-provided-in-root/builds/default/model/order.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export interface Order {
2424
complete?: boolean;
2525
}
2626
export namespace Order {
27-
export type StatusEnum = 'placed' | 'approved' | 'delivered';
2827
export const StatusEnum = {
29-
Placed: 'placed' as StatusEnum,
30-
Approved: 'approved' as StatusEnum,
31-
Delivered: 'delivered' as StatusEnum
32-
};
28+
Placed: 'placed',
29+
Approved: 'approved',
30+
Delivered: 'delivered'
31+
} as const;
32+
export type StatusEnum = typeof StatusEnum[keyof typeof StatusEnum];
3333
}
3434

3535

samples/client/petstore/typescript-angular-v12-provided-in-root/builds/default/model/pet.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ export interface Pet {
2626
status?: Pet.StatusEnum;
2727
}
2828
export namespace Pet {
29-
export type StatusEnum = 'available' | 'pending' | 'sold';
3029
export const StatusEnum = {
31-
Available: 'available' as StatusEnum,
32-
Pending: 'pending' as StatusEnum,
33-
Sold: 'sold' as StatusEnum
34-
};
30+
Available: 'available',
31+
Pending: 'pending',
32+
Sold: 'sold'
33+
} as const;
34+
export type StatusEnum = typeof StatusEnum[keyof typeof StatusEnum];
3535
}
3636

3737

samples/client/petstore/typescript-angular-v12-provided-in-root/builds/with-npm/model/order.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export interface Order {
2424
complete?: boolean;
2525
}
2626
export namespace Order {
27-
export type StatusEnum = 'placed' | 'approved' | 'delivered';
2827
export const StatusEnum = {
29-
Placed: 'placed' as StatusEnum,
30-
Approved: 'approved' as StatusEnum,
31-
Delivered: 'delivered' as StatusEnum
32-
};
28+
Placed: 'placed',
29+
Approved: 'approved',
30+
Delivered: 'delivered'
31+
} as const;
32+
export type StatusEnum = typeof StatusEnum[keyof typeof StatusEnum];
3333
}
3434

3535

samples/client/petstore/typescript-angular-v12-provided-in-root/builds/with-npm/model/pet.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ export interface Pet {
2626
status?: Pet.StatusEnum;
2727
}
2828
export namespace Pet {
29-
export type StatusEnum = 'available' | 'pending' | 'sold';
3029
export const StatusEnum = {
31-
Available: 'available' as StatusEnum,
32-
Pending: 'pending' as StatusEnum,
33-
Sold: 'sold' as StatusEnum
34-
};
30+
Available: 'available',
31+
Pending: 'pending',
32+
Sold: 'sold'
33+
} as const;
34+
export type StatusEnum = typeof StatusEnum[keyof typeof StatusEnum];
3535
}
3636

3737

samples/client/petstore/typescript-angular-v13-provided-in-any/builds/default/model/order.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export interface Order {
2424
complete?: boolean;
2525
}
2626
export namespace Order {
27-
export type StatusEnum = 'placed' | 'approved' | 'delivered';
2827
export const StatusEnum = {
29-
Placed: 'placed' as StatusEnum,
30-
Approved: 'approved' as StatusEnum,
31-
Delivered: 'delivered' as StatusEnum
32-
};
28+
Placed: 'placed',
29+
Approved: 'approved',
30+
Delivered: 'delivered'
31+
} as const;
32+
export type StatusEnum = typeof StatusEnum[keyof typeof StatusEnum];
3333
}
3434

3535

0 commit comments

Comments
 (0)