目前所负责的所有前端项目的接口请求都会用工具根据 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 文档上做了更新:
常规操作就是,我们 copy 字段名称,加到类型声明上就好了:
/**
* ehr组织编码
*/
ehrOrgCode: string;
当然有时候我也会偷懒,不加注释。
经常重复如此无聊的工作,我自己是无法接受的,秉着“重复的工作工具化”的原则,本人采取的措施就是分析规律,规则然后造轮子了。
正常思路就是通过代码程序处理文本,然后生成代码。比如新增的接口字段,把文本复制出来是如下的样子:
通过代码处理换行符以及制表符:
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 根据例子规则处理我们给的内容,最后给出生成的代码,如下:
当然,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 插件,就可以完成一个随用随关的工具了:
上面说的例子只是处理了单个字段的问题,而且生成 prompt 的代码里还是需要去处理复制的文本中的制表符和换行符问题,如果是多个字段还要考虑字段的分割问题。一开始想到的解决方案是把截图直接发送给 AI 处理,但是那样的话就太费 token 了。
在使用 uTools OCR 文字识别的时候, 无意间发现已经支持表格识别,而 YAPI 接口文档不就是一个表格吗,把表格发给 AI 应该也能行,所以就试了下,还真解析出来了:
之前印象中 uTools OCR 用的是百度的,就去翻了下百度 OCR 的接口文档,发现好麻烦。另辟蹊径就去看了 uTools OCR 插件的代码,发现有接口能直接用,就扒出来了(调接口的时候需要传入 uTools 的 token,所以只能在 uTools 里使用,我最终的代码也是跑在 uTools 里的,所以问题不大)。
整合之后发给 AI 的 prompt 如下:
生成 prompt 代码如下:
全部代码整合到 uTools 插件里,最终使用效果如下:
以上就是让 AI 间接根据 YAPI 接口文档生成新增字段 TS 类型的所有内容。
我们的核心逻辑是在重复的工作中发现规律, 把规律抽象出来,或者通过具体例子让 AI 自己去发现规律,然后替我们干活。所以,即便你用的接口文档不是 YAPI,或者压根没有接口文档,完全靠后端截个图(我遇到过),利用 AI 也是有解决可能的,比如直接把聊天记录发给 AI。