好奇sequelize里面的STRING怎么实现的,既可以DataTypes.STRING当常量用作VARCHAR(255),也可以DataTypes.STRING(32)当做函数用,传参控制VARCHAR长度,看了git项目,里面的STRING只是个class继承了别的class,代码也都没啥新奇的,常量用能理解,函数没看懂,怎么做到既可以是常量也可以是函数的,里面的toString是什么机制调用的
自己想写个类似的
class STRING {
constructor(len) {
this.len = len;
}
toString() {
return this.len ? `VARCHAR(${this.len})` : 'VARCHAR(255)';
}
get result() {
return this.len ? `VARCHAR(${this.len})` : 'VARCHAR(255)';
}
}写的不对,帮忙看看?
琢磨出来了,直接上代码:
原理很简单,static属性的toString可以支持DataTypes.STRING的写法,使用Proxy对DataTypes.STRING做代理,代理的内容就是将DataTypes.STRING
new一下,使其可以接受传参,public属性的toString可以支持代理之后DataTypes.STRING(123)的写法。程序内部取STRING值的时候全部转换为string类型,因为sql拼接的时候无疑是字符串拼接,所以STRING两个toString都派上了用场