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
相关产品推荐
相关产品推荐

