我定义如下,目的是在sequelize定义时,做预处理。
const Model = app.model.define(
'area',
{
areaId: {
type: INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true,
},
name: { type: STRING(32), allowNull: false },
points: {
type: TEXT,
set(val) {
// this.setDataValue('points', JSON.stringify(val)); //error.
Model.prototype.setDataValue.bind(this)( //correct
'points',
JSON.stringify(val),
);
},
get() {
return JSON.parse(Model.prototype.getDataValue.bind(this)('points'));
},
},
},
{
timestamps: false,
},
);
this.setDataValue(‘points’, JSON.stringify(val)); 这句话,放到js环境下不会有什么问题。 而在ts下,由于this指向不明,导致setDataValue方法不存在。 我看了源码,源码在这里用call,让this指向了model实例,于是我写了下面这样的方式,去保证ts不报错。 但这样我觉得还是繁琐,毕竟只要声明出现这个方法即可。 搜了很多也没找到我想要的例子,所以来求助下。
set(this: Modal, val) { … }
@ekoneko 感谢,还真的可以,是ts的某种语法糖吗
不算语法糖吧…
js 函数中的 this
没有办法在定义处被推断
因此 ts 支持显示的声明 this 类型
可以参考文档: https://www.typescriptlang.org/docs/handbook/functions.html
不知道你用的是什么数据库.
如果是 mysql 的话, 直接就有 JSON
字段类型, 不用这样转换
@ekoneko 感谢
@zhuweiyou 嗯嗯,这里举例说明我想做的事情,类似于这种数据处理。
@wbget TypeScript 方法、函数参数的签名第一个参数可以传入this的类型
// 调用时需要忽略 this 参数
export function foo(this: SomeType, ) {
}
@waitingsong 谢了老哥,最后在sequelize的issue里问到答案了,就是你说的这样。
@wbget sequelize, TypeORM 对于 nodejs 的通常应用场景来说过重了,学习、编码成本比较高。 我是倾向于 QueryBuilder 类型框架: 同样查询场景足够,复杂查询场景写原生SQL。