使用 TypeScript 在 Node.js 中进行 Sequelize - 没有“new”就无法调用类构造函数模型

Posted

技术标签:

【中文标题】使用 TypeScript 在 Node.js 中进行 Sequelize - 没有“new”就无法调用类构造函数模型【英文标题】:Sequelize in Node.js with TypeScript - Class constructor Model cannot be invoked without 'new' 【发布时间】:2020-05-10 06:14:15 【问题描述】:

我正在尝试在 Node.js + TypeScript 中使用 Sequelize。我正在尝试使用以下简单代码:

import Sequelize, Model, DataTypes from 'sequelize';

const sequelize = new Sequelize('base', 'user', 'pass', dialect: 'mysql');

class User extends Model 

User.init(
    id: 
        type: DataTypes.INTEGER.UNSIGNED,
        autoIncrement: true,
        primaryKey: true,
        unique: true,
    ,
    login: 
        type: DataTypes.STRING(255),
        allowNull: false,
        unique: true,
    ,
    password: 
        type: DataTypes.STRING(255),
        allowNull: false,
    ,
, 
    tableName: 'users',
    sequelize,
);

sequelize.sync().then(() => 
    User.create(
        login: 'aaaa',
        password: 'bbbb',
    );
);

但是,当尝试运行已编译的代码时,我收到以下错误:

未处理的拒绝类型错误:类构造函数模型不能 调用时不带“新”

据我了解,这不是 sequelize 的问题:与 javascript 代码运行相同的代码运行没有问题,并在数据库适当的表中创建记录。我知道这是将 ES6 类转换为 ES5 的问题,但是我无法修复此错误。这是我的 tsconfig.json:


  "compilerOptions": 
    "experimentalDecorators": true,
    "outDir": "./dist",
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "module": "esnext",
    "target": "es5",
    "sourceMap": true,
    "moduleResolution": "node",
    "lib": ["es5", "dom", "esnext"],
    "jsx": "react",
    "typeRoots": ["./common/typings", "./node_modules/@types"]
  ,
  "exclude": [
    "node_modules"
  ]

根据我在 *** 类似问题和互联网上的各种站点中阅读的内容,将编译器选项中的目标更改为 ES6 应该可以解决问题,但即使在这样的更改之后问题仍然存在。我在这里做错了什么已经没有想法了,所以我们将不胜感激。

【问题讨论】:

【参考方案1】:

尝试在 tsconfig.json 中将目标更改为 "ES2017"。为我解决了问题。

【讨论】:

它在根目录下,叫做tsconfig.json。这是您放置打字稿配置设置的地方。【参考方案2】:

转到tsconfig.json 文件。然后,将 target 更改为 es6,如下例所示:


  "compilerOptions": 
    "target": "es6",
    "module": "commonjs",
    "declaration": true,
    "outDir": "./lib",
    "strict": true
  ,
  "include": ["src"],
  "exclude": ["node_modules", "**/__tests__/*"]

【讨论】:

这对我有用。最初我将其设置为 es5。【参考方案3】:

感谢https://***.com/users/4344732/tran-son-hoang,将"module": "commonjs" 添加到tsconfig.josn 后我已经解决了问题

"compilerOptions": 
    ...
    "module": "commonjs",
    ...
  ,

【讨论】:

以上是关于使用 TypeScript 在 Node.js 中进行 Sequelize - 没有“new”就无法调用类构造函数模型的主要内容,如果未能解决你的问题,请参考以下文章

使用 TypeScript 在 Node.js 中进行 Sequelize - 没有“new”就无法调用类构造函数模型

为啥在使用 Node.js 的许多文件中存在*** const 或 let 具有相同名称时,Typescript 会出错

使用 Typescript 开发 node.js 项目——简单的环境配置

在 node.js 中扩展 TypeScript 全局对象

Node.js + TypeScript:类型脚本编译代码的语法不明确

nodemon 没有在 webpack-typescript-node.js 中监视目录?