后端大佬总是不按大路出牌,我能怎么办?

64 阅读2分钟

先声明,并没有什么大事。这篇文章只是提供了一个JS工具方法而已,用于将JAVA后端类型字符转换为精确的TS类型的。

事情是这样的,之前有写过一个写过一个浏览器插件,快速将Eolink接口转为精确的TS类型。奈何后端童鞋并不会按套路出牌,没了公司的强制要求,后端大佬的他接口直接不上传Eolink了。

20240321-131904.jpg

后端大佬随手甩过来的,就是包含类似下面后端类型声明的文档:

{
    private Long fid; // 父id
    private Integer fatherTagLevel; // 父id对应的标签等级
    private Integer queryTagLevel; // 需要查询的标签等级
    private List<String> tagTypeList;
    private Boolean isNeedWord = false; // 是否需要返回keyword
    private Boolean isNeedFather = false; // 是否需要父类信息
    private Boolean isNeedGrandFather = false;
    private Boolean isNeedKeywordCount = false;
}

之前写eolink-api-2-ts-type就是为了解决,后端接口字段过多时,对于接口的出入参转换为精确的TS类型太麻烦的问题。费了好大的力,解决了这个问题,后端大佬突然上传接口到Eolink了???

我能怎么办,我也很绝望!!!
怎么办,放弃?打工人,怎么能放弃!!!

在我坚定的“一定要在业务开发过程中深度践行TS”决心之下,这点小困难算什么!!!
看我怎么逢山开路、遇水架桥!![手动狗头]

20240321-131918.jpg

言归正传。仔细看了上面后端类型,还是有规律的。所以,写了个工具方法,使用正则做了替换,实现快速将上述格式的类型转为ts类型,更方便接口声明入参/反参类型。

const javaType2TsTypeFn = (str) => {

    const typeMap = {
        String: 'string',
        char: 'string',
        Long: 'string',
        Integer: 'number',
        Int: 'number',
        Float: 'number',
        Double: 'number',
        BigDecimal: 'number',
        Boolean: 'boolean',
    }

    // 清除属性修饰符号
    let newStr = str.replace(/(private|protected|public)\s/g, '');

    // 处理有默认值行,如: "Boolean isAttention = false"
    newStr = newStr.replace(/(\w+)\s*(\w+)\s*\=\s*(\w+);/g,(...val)=>{
        return val[2]+': '+(typeMap[val[1]]||val[1])+'; // 默认值:'+val[3];
    });

    // 处理数组类型 如:List<AbaProduct> asinList;
    newStr = newStr.replace(/List.*?\<(\w+)\>.*?(\w+);/g,(...val)=>{
        return val[2]+': '+(typeMap[val[1]]||val[1])+'[];';
    });

    // 处理剩余未处理到的类型
    newStr = newStr.replace(new RegExp(`(${Object.keys(typeMap).join('|')})\\s*?(\\w+);`,'g'),(...val)=>{
        return val[2]+': '+(typeMap[val[1]]||val[1])+';';
    });

    console.log(newStr);
    return newStr;

}

// 直接调用函数,PS:要使用字符串模板才能传入多行字符同时操持返回格式
javaType2TsTypeFn(`{
    private Long fid; // 父id
    private Integer fatherTagLevel; // 父id对应的标签等级
    private Integer queryTagLevel; // 需要查询的标签等级
    private List<String> tagTypeList;
    private Boolean isNeedWord = false; // 是否需要返回keyword
    private Boolean isNeedFather = false; // 是否需要父类信息
    private Boolean isNeedGrandFather = false;
    private Boolean isNeedKeywordCount = false;
}`)

以上,是参考已知类型进行的处理,后续如果还有其它方法,童鞋们可以根据需要持续丰富这个工具方法。