先声明,并没有什么大事。这篇文章只是提供了一个JS工具方法而已,用于将JAVA后端类型字符转换为精确的TS类型的。
事情是这样的,之前有写过一个写过一个浏览器插件,快速将Eolink接口转为精确的TS类型。奈何后端童鞋并不会按套路出牌,没了公司的强制要求,后端大佬的他接口直接不上传Eolink了。
后端大佬随手甩过来的,就是包含类似下面后端类型声明的文档:
{
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”决心之下,这点小困难算什么!!!
看我怎么逢山开路、遇水架桥!![手动狗头]
言归正传。仔细看了上面后端类型,还是有规律的。所以,写了个工具方法,使用正则做了替换,实现快速将上述格式的类型转为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;
}`)
以上,是参考已知类型进行的处理,后续如果还有其它方法,童鞋们可以根据需要持续丰富这个工具方法。