You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改OpenAPI Generator生成的TypeScript Axios客户端的Api与方法名

针对TypeScript Axios客户端的类名与方法名定制方案

针对你需要将AuthenticationApi改为AuthenticationAPI、authenticationControllerLogin改为Login的需求,提供以下几种可行方案:

一、自定义Mustache模板改造(推荐,无额外依赖)

openapi-generator的模板支持扩展字符串处理函数,可直接修改模板实现定制:

  1. 导出默认模板:先将typescript-axios的官方模板导出到本地目录:
openapi-generator-cli author template -g typescript-axios -o ./custom-templates
  1. 修改类名规则:打开custom-templates/api.mustache,找到类定义行:
export class {{classname}} extends BaseAPI {

替换为:

export class {{classname replace 'Api' 'API'}} extends BaseAPI {
  1. 修改方法名规则:打开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}}> {
  1. 使用定制模板生成代码:更新生成命令,指定自定义模板目录:
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脚本(简单直接,快速生效)

若不想修改模板,可在代码生成后用脚本批量替换:

  1. 创建修复脚本:新建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);
  1. 执行脚本:生成代码后运行:
node fix-api-names.js

三、自定义生成器逻辑(深度定制,长期维护)

如果需要长期定制生成规则,可修改openapi-generator的Java源码:

  1. 拉取对应版本代码:
git clone https://github.com/OpenAPITools/openapi-generator.git
cd openapi-generator
git checkout v2.13.3
  1. 修改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);
      }
      
  2. 编译并使用自定义生成器:编译项目后,用本地构建的jar包替换原cli依赖,或直接用该jar执行生成命令。

内容的提问来源于stack exchange,提问作者Kr1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:19:51