在sequelize中使用typescript,遇到了一个this指向不明的问题。
发布于 5 年前 作者 wbget 5281 次浏览 来自 问答

我定义如下,目的是在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 字段类型, 不用这样转换

@zhuweiyou 嗯嗯,这里举例说明我想做的事情,类似于这种数据处理。

@wbget TypeScript 方法、函数参数的签名第一个参数可以传入this的类型

// 调用时需要忽略 this 参数
export function foo(this: SomeType, ) {
}

@waitingsong 谢了老哥,最后在sequelize的issue里问到答案了,就是你说的这样。

@wbget sequelize, TypeORM 对于 nodejs 的通常应用场景来说过重了,学习、编码成本比较高。 我是倾向于 QueryBuilder 类型框架: 同样查询场景足够,复杂查询场景写原生SQL。

回到顶部