You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express TypeScript使用Sequelize报错Property 'User' does not exist on type 'typeof db'如何解决

解决方案

错误原因

该报错属于TypeScript类型校验错误:sequelize-cli默认生成的模型入口为JS文件,导出的db对象通过动态读取文件的方式挂载模型属性,没有显式声明类型,因此TypeScript无法识别db对象上存在User属性。


方案1:补充类型声明(快速适配,无需修改现有JS文件)

在models目录下新建类型声明文件index.d.ts,写入以下内容:

import { ModelCtor, Sequelize } from "sequelize";

// 先声明User模型的类型
interface User extends Model {
  id: number;
  name: string;
  email: string;
  password: string;
  createdAt: Date;
  updatedAt: Date;
}

// 定义db对象的完整类型
interface DbInterface {
  User: ModelCtor<User>;
  sequelize: Sequelize;
  Sequelize: typeof Sequelize;
  // 后续新增其他模型,只需在此处补充对应的类型声明即可
}

declare const db: DbInterface;
export default db;

添加后TS就能正确识别db上的User属性,报错自动消失。


方案2:全量切换为TS写法(长期项目推荐,类型更安全)

第一步:安装必要依赖

npm install @types/sequelize sequelize-typescript

第二步:修改user.js为user.ts

import { Model, DataTypes, Optional } from "sequelize";

// 声明User模型的属性类型
interface UserAttributes {
  id: number;
  name: string;
  email: string;
  password: string;
}
// 声明创建User时可选的属性(比如id自增,创建时不需要传)
interface UserCreationAttributes extends Optional<UserAttributes, "id"> {}

export class User extends Model<UserAttributes, UserCreationAttributes> implements UserAttributes {
  public id!: number;
  public name!: string;
  public email!: string;
  public password!: string;
  public readonly createdAt!: Date;
  public readonly updatedAt!: Date;

  static associate(models: any) {
    // 模型关联逻辑写在此处
  }
}

第三步:修改index.js为index.ts

替换原有的动态读取逻辑,改为显式导入模型,避免动态类型丢失:

import { Sequelize } from "sequelize";
import { User } from "./user";

const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];

// 初始化sequelize实例
let sequelize: Sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable] as string, config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

// 显式挂载所有模型
const db = {
  User,
  sequelize,
  Sequelize
};

// 初始化模型关联
Object.keys(db).forEach(modelName => {
  if (db[modelName as keyof typeof db].associate) {
    db[modelName as keyof typeof db].associate(db);
  }
});

// 初始化User模型
User.init(
  {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING,
  },
  {
    sequelize,
    modelName: "User",
    tableName: "users"
  }
);

export default db;

临时绕过方案

如果只是临时调试不想改类型,可以直接用类型断言跳过校验,不推荐生产环境使用:

const { User } = DB as any;

内容的提问来源于stack exchange,提问作者Hiep Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 20:27:02