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

我定义如下,目的是在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不报错。 但这样我觉得还是繁琐,毕竟只要声明出现这个方法即可。 搜了很多也没找到我想要的例子,所以来求助下。

6 回复

set(this: Modal, val) { … }

@ekoneko 感谢,还真的可以,是ts的某种语法糖吗

不算语法糖吧… js 函数中的 this 没有办法在定义处被推断 因此 ts 支持显示的声明 this 类型 可以参考文档: https://www.typescriptlang.org/docs/handbook/functions.html

不知道你用的是什么数据库. 如果是 mysql 的话, 直接就有 JSON 字段类型, 不用这样转换

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

回到顶部