如何配置openapi-typescript生成TypeScript枚举而非字符串联合类型?
解决openapi-typescript生成TypeScript枚举的问题
核心方案
openapi-typescript 默认会把 OpenAPI 的 enum 转为 TypeScript 字符串联合类型,但可以通过以下两种方式生成你需要的枚举:
方式1:使用工具内置的枚举生成支持(v6+版本)
在你的 OpenAPI Schema 中添加 x-enumNames 扩展字段(如果枚举键和值一致,这个字段可以省略,但加上更明确):
openapi: 3.0.1 info: title: test enums description: test enums version: "1.00" components: schemas: VideoProcessingStateDto: type: string enum: - IN_PROGRESS - FAILED - FINISHED x-enumNames: # 对应枚举的键名,和enum值一致时可省略 - IN_PROGRESS - FAILED - FINISHED
然后在命令行执行时加上 --enum 参数:
openapi-typescript your-api-spec.yaml --enum --output types.ts
执行后就能生成你期望的 TypeScript 枚举代码。
方式2:自定义后处理脚本(兼容旧版本)
如果你的 openapi-typescript 版本低于v6,或者不想修改 OpenAPI Schema,可以写一个简单的脚本,将生成的联合类型替换为枚举。比如用 Node.js 脚本匹配目标类型并替换:
const fs = require('fs'); const content = fs.readFileSync('./types.ts', 'utf8'); const updatedContent = content.replace( /\/\*\* @enum \{string\} \*\/\nVideoProcessingStateDto: "IN_PROGRESS" | "FAILED" | "FINISHED";/, 'export enum VideoProcessingStateDto {\n IN_PROGRESS = \'IN_PROGRESS\',\n FAILED = \'FAILED\',\n FINISHED = \'FINISHED\',\n}' ); fs.writeFileSync('./types.ts', updatedContent);
执行这个脚本就能完成替换。
补充说明
openapi-typescript 默认生成联合类型是因为在多数 TypeScript 场景下,联合类型和枚举的功能等价且更轻量,但如果业务场景必须使用枚举,上述两种方法都能满足需求。
内容的提问来源于stack exchange,提问作者alex bennett
相关产品推荐
相关产品推荐

