Don't repeat yourself,让 AI 高效、准确的干活 - (一)补全后端接口 TS 类型

535 阅读3分钟

目前所负责的所有前端项目的接口请求都会用工具根据 YAPI 接口文档生成声明完整的 TS 类型,比如:

// #region 根据token获取用户信息
export interface IFetchUserInfoResult {
  code: number;
  message: string;
  result: {
    /**
     * 姓名
     */
    name: string;
    /**
     * 昵称
     */
    nickName: string;
    /**
     * 手机号
     */
    phone: string;
    /**
     * sap编码
     */
    sap: string;
    /** 用户 id */
    userId?: string;
  };
}

/**
 * 根据token获取用户信息
 * https://yapi.xxxxx.com/project/2205/interface/api/144824
 * @author xxoo
 *
 * @returns
 */
export function fetchUserInfo() {
  return request<IFetchUserInfoResult>({
    url: `${HOST}/xx/yy/getUserInfoByToken`,
    method: "GET",
  });
}
// #endregion

上面的代码是用工具根据 YAPI 文档生成的。

经常遇到的一个问题是,接口增加了字段,需要手动增加类型。

比如接口增加了 ehrOrgCode 字段,后端开发也在 YAPI 文档上做了更新:

image.png

常规操作就是,我们 copy 字段名称,加到类型声明上就好了:

/**
 * ehr组织编码
 */
ehrOrgCode: string;

当然有时候我也会偷懒,不加注释。

经常重复如此无聊的工作,我自己是无法接受的,秉着“重复的工作工具化”的原则,本人采取的措施就是分析规律,规则然后造轮子了。

正常思路就是通过代码程序处理文本,然后生成代码。比如新增的接口字段,把文本复制出来是如下的样子:

image.png

通过代码处理换行符以及制表符:

const str = `
ehrOrgCode	string	
非必须
ehr组织编码
`;

const arr = str.split(/\t|\n/).filter((s) => s);
console.log(arr);

得到如下结果:

[ 'ehrOrgCode', 'string', '非必须', 'ehr组织编码' ]

然后生成类型代码:

const str = `
ehrOrgCode	string	
非必须
ehr组织编码
`;

const arr = str.split(/\t|\n/).filter((s) => s);
console.log(arr);

const code = `
/**
 * ${arr[3]}
 */
${arr[0]}: ${arr[1]};
`;
console.log(code);

这里是完全没有考虑各种边界问题的,比如字段类型在文档上可能是 integer,这是需要做转换的。

完全依靠代码进行处理,如果边界问题处理不好抛异常了,代码也就无法正常生成了。而且上面还是只是处理一个字段的场景,如果接口同时增加了多个字段,边界问题也会更多。

我们尝试用 AI 来解决这个问题,那么 prompt 该怎么写呢?

我们先给 AI 一个例子,然后让 AI 根据例子规则处理我们给的内容,最后给出生成的代码,如下:

image.png

当然,prompt 是通过代码生成的:

  const clipboardText = clipboard.readText() || '';
  if (!clipboardText) {
    return '请复制内容';
  }
  const requestPrompt = `
\`\`\`
dateType
integer
非必须
日期类型 0~录入时间、1~成交时间、2~结案时间、3~申佣时间
\`\`\`

根据上面的内容生成如下 TS 代码

\`\`\`js
/** 日期类型 0~录入时间、1~成交时间、2~结案时间、3~申佣时间 */
dateType: number;
\`\`\`

按照上面的规则,请根据下面的内容生成代码:

\`\`\`
${clipboardText
  .split(/\t|\n/)
  .filter((s) => s)
  .join('\n')}
\`\`\`  
`;

结合 uTools 插件,就可以完成一个随用随关的工具了:

utools-3.gif

上面说的例子只是处理了单个字段的问题,而且生成 prompt 的代码里还是需要去处理复制的文本中的制表符和换行符问题,如果是多个字段还要考虑字段的分割问题。一开始想到的解决方案是把截图直接发送给 AI 处理,但是那样的话就太费 token 了。

在使用 uTools OCR 文字识别的时候, 无意间发现已经支持表格识别,而 YAPI 接口文档不就是一个表格吗,把表格发给 AI 应该也能行,所以就试了下,还真解析出来了:

image.png

之前印象中 uTools OCR 用的是百度的,就去翻了下百度 OCR 的接口文档,发现好麻烦。另辟蹊径就去看了 uTools OCR 插件的代码,发现有接口能直接用,就扒出来了(调接口的时候需要传入 uTools 的 token,所以只能在 uTools 里使用,我最终的代码也是跑在 uTools 里的,所以问题不大)。

整合之后发给 AI 的 prompt 如下:

长截图_2024-11-24_16-33-44.png

生成 prompt 代码如下:

code-snapshot-1732437888993.png

全部代码整合到 uTools 插件里,最终使用效果如下:

utools-4.gif

以上就是让 AI 间接根据 YAPI 接口文档生成新增字段 TS 类型的所有内容。

我们的核心逻辑是在重复的工作中发现规律, 把规律抽象出来,或者通过具体例子让 AI 自己去发现规律,然后替我们干活。所以,即便你用的接口文档不是 YAPI,或者压根没有接口文档,完全靠后端截个图(我遇到过),利用 AI 也是有解决可能的,比如直接把聊天记录发给 AI。