如何修改OpenAPI Generator生成的TypeScript Axios客户端的Api与方法名
针对TypeScript Axios客户端的类名与方法名定制方案
针对你需要将AuthenticationApi改为AuthenticationAPI、authenticationControllerLogin改为Login的需求,提供以下几种可行方案:
一、自定义Mustache模板改造(推荐,无额外依赖)
openapi-generator的模板支持扩展字符串处理函数,可直接修改模板实现定制:
- 导出默认模板:先将typescript-axios的官方模板导出到本地目录:
openapi-generator-cli author template -g typescript-axios -o ./custom-templates
- 修改类名规则:打开
custom-templates/api.mustache,找到类定义行:
export class {{classname}} extends BaseAPI {
替换为:
export class {{classname replace 'Api' 'API'}} extends BaseAPI {
- 修改方法名规则:打开
custom-templates/apiInner.mustache,找到方法定义行:
public async {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{dataType}}{{#hasMore}}, {{/hasMore}}{{/allParams}}): Promise<{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
如果你的接口方法名都是xxxControllerXxx格式,替换为:
public async {{nickname split 'Controller' last}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{dataType}}{{#hasMore}}, {{/hasMore}}{{/allParams}}): Promise<{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
若需适配任意驼峰格式提取最后一个单词,改用:
public async {{nickname split /(?=[A-Z])/ last}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{dataType}}{{#hasMore}}, {{/hasMore}}{{/allParams}}): Promise<{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
- 使用定制模板生成代码:更新生成命令,指定自定义模板目录:
openapi-generator-cli generate -i http://localhost:3040/api/v1-json -g typescript-axios -o src/tools/api/sdk --skip-validate-spec -t ./custom-templates
二、后处理Node.js脚本(简单直接,快速生效)
若不想修改模板,可在代码生成后用脚本批量替换:
- 创建修复脚本:新建
fix-api-names.js文件:
const fs = require('fs'); const path = require('path'); const apiDir = path.resolve(__dirname, 'src/tools/api/sdk'); function traverseAndFix(dir) { fs.readdirSync(dir).forEach(file => { const fullPath = path.join(dir, file); const stats = fs.statSync(fullPath); if (stats.isDirectory()) { traverseAndFix(fullPath); } else if (file.endsWith('.ts') && !file.includes('base') && !file.includes('index')) { let content = fs.readFileSync(fullPath, 'utf8'); // 替换类名后缀:Api → API content = content.replace(/export class (\w+)Api extends BaseAPI/g, 'export class $1API extends BaseAPI'); // 简化方法名:移除Controller前缀部分 content = content.replace(/public async (\w+)Controller(\w+)\(/g, 'public async $2('); fs.writeFileSync(fullPath, content, 'utf8'); console.log(`Fixed file: ${fullPath}`); } }); } traverseAndFix(apiDir);
- 执行脚本:生成代码后运行:
node fix-api-names.js
三、自定义生成器逻辑(深度定制,长期维护)
如果需要长期定制生成规则,可修改openapi-generator的Java源码:
- 拉取对应版本代码:
git clone https://github.com/OpenAPITools/openapi-generator.git cd openapi-generator git checkout v2.13.3
- 修改TypeScriptAxios生成器:找到
modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAxiosClientCodegen.java:- 修改类名后缀:将
apiNameSuffix的默认值从"Api"改为"API"; - 修改方法名生成逻辑:重写
getOperationId方法,截取Controller后的部分:@Override public String getOperationId(String operationId) { if (operationId != null && operationId.contains("Controller")) { return operationId.split("Controller")[1]; } return super.getOperationId(operationId); }
- 修改类名后缀:将
- 编译并使用自定义生成器:编译项目后,用本地构建的jar包替换原cli依赖,或直接用该jar执行生成命令。
内容的提问来源于stack exchange,提问作者Kr1
相关产品推荐
相关产品推荐

