TypeScript的全新功能,尝试使用Sequelize

问题描述 投票:0回答:3

我是TypeScript的新手,我正在尝试使用Sequelize和Sequelize Auto生成数据库模型,然后使用它们进行查询。

到目前为止,已经生成了模型,但是当我尝试实际使用它们时,会出现错误。

/* jshint indent: 2 */
// tslint:disable
import * as sequelize from 'sequelize';
import {DataTypes} from 'sequelize';
import {settings_user_tblInstance, settings_user_tblAttribute} from './db';

module.exports = function(sequelize: sequelize.Sequelize, DataTypes: DataTypes) {
  return sequelize.define<settings_user_tblInstance, settings_user_tblAttribute>('settings_user_tbl', {
    id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    user_id: {
      type: DataTypes.BIGINT,
      allowNull: true,
      references: {
        model: 'user_tbl',
        key: 'id'
      },
      unique: true
    },
    notification_email_enabled: {
      type: DataTypes.BOOLEAN,
      allowNull: false,
      defaultValue: true
    }
  }, {
    tableName: 'settings_user_tbl'
  });
};

但是尝试使用此模型时,出现以下错误:

   return sequelize.define<settings_user_tblInstance, settings_user_tblAttribute>('settings_user_tbl', {


src/models/tag_group_tbl.ts:7:70 - error TS2709: Cannot use namespace 'DataTypes' as a type.

 module.exports = function(sequelize: sequelize.Sequelize, DataTypes: DataTypes) {

我对这两个错误都感到很迷惑-好像DataTypes定义正确?这就是Sequelize Auto生成文件的方式-是否这样做不正确?

为什么它只期望0个参数而不是2个?

这可能是版本不兼容的事情吗?

很抱歉,这个毫无头绪的问题-从字面上看,我刚开始使用TypeScript,但我不确定这到底是怎么回事。

javascript typescript sequelize.js
3个回答
1
投票

我认为这不是在续集中使用Typescript的正确方法。通常,我们定义要定义的模型的接口。

实际上,文档中有一个打字稿实现的示例。 https://sequelize.org/master/manual/typescript.html


0
投票

老实说,目前sequelize-auto的TS支持确实不好,生成器将创建错误的类型。

[最新版本也已经发布two years ago,人们也分叉并发布了their own packages,所以我不确定是否正在积极地进行开发。您仍然可以让sequelize-auto创建样板列定义,类属性等,然后手动将它们复制到模型中。

首先,使用sequelize-auto选项运行-z以创建类型定义。示例:

-z

给定数据库中的npx sequelize-auto -h localhost -u dontcare -d my-db.db --dialect sqlite -z 表,user生成文件sequelize-autouser.ts下的其他文件,其中包含您已经遇到的大量TS编译错误。例如,models是一个命名空间,但在函数参数中用作类型,泛型在DataTypes函数上设置,根本不需要泛型。

sequelize.define使用sequelize-auto创建模型定义。我宁愿坚持使用类语法,如sequelize sequelize.define的第一部分所示-它产生更易读且易于声明的类型。

因此,总而言之,坚持使用sequelize.define,复制我们所需的代码并随后再次删除生成的文件更有意义。有用的代码是生成的表列定义和类属性:

TypeScript docs section中,复制所有表列属性,例如above tutorial等。在user.ts下,应该有类似id: { type: DataTypes.INTEGER, allowNull: true, primaryKey: true }的界面,可以从中使用类属性。最后,在某处通过类语法创建模型:

db.d.ts

userAttribute模型。在这里,您还可以将生成的代码粘贴到:

import { Sequelize, Model } from 'sequelize';

// your models 
class User extends Model {
  // paste class attributes here
  // also add `null assertion` `!`, which is required in strict mode (see their docs)
}
...

希望,会有所帮助。


0
投票

[某人具有与initialize回购完全相同的User.init({ /*pass column definitions*/ } ,并最终成为issue回购,他最近似乎很活跃:值得尝试一下他的版本,看看是否能解决问题,他实际上已在原始存储库中关闭了该问题😃

但是我建议您尝试切换到sequelize-autoforking,因为从第一天开始它就是面向Typescript的。

© www.soinside.com 2019 - 2024. All rights reserved.