在sequelize中使用typescript,遇到了一个this指向不明的问题。
发布于 6 年前 作者 wbget 6404 次预览 最后一次回复是 5 年前 来自 问答
我定义如下,目的是在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不报错。 但这样我觉得还是繁琐,毕竟只要声明出现这个方法即可。 搜了很多也没找到我想要的例子,所以来求助下。
9 回复
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的类型
@waitingsong 谢了老哥,最后在sequelize的issue里问到答案了,就是你说的这样。
@wbget sequelize, TypeORM 对于 nodejs 的通常应用场景来说过重了,学习、编码成本比较高。 我是倾向于 QueryBuilder 类型框架: 同样查询场景足够,复杂查询场景写原生SQL。