Sequelize+TypeScript报错:Model无rawAttributes属性及解决问询
解决Sequelize TypeScript中
rawAttributes类型不存在的问题 问题背景
将JavaScript代码库迁移到Sequelize + TypeScript时,遇到类型错误:
Property 'rawAttributes' does not exist on type 'Model<any, any, any>'
代码示例:
interface UserAttributes { id: number; name: string; email: string; } interface UserInstance extends Sequelize.Instance<UserAttributes>, UserAttributes {} const User = sequelize.define<UserInstance>('User', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, name: Sequelize.STRING, email: Sequelize.STRING, }); // 报错位置:User.rawAttributes
该代码在JavaScript中正常运行,忽略编译错误后TypeScript也能执行,但需要类型安全的解决方案。使用版本:
{ "typescript": "^5.3.3", "sequelize": "6.19.0" }
报错原因
- Sequelize 6.x的官方TypeScript类型定义中,
Model基类默认未暴露rawAttributes这个静态内部属性,尽管它在JavaScript运行时确实存在。 - 你使用的
Sequelize.Instance接口在Sequelize 6中已被废弃,官方推荐直接使用Model泛型来定义实例类型,旧的定义方式会导致类型推断不完整。
解决方案
方案1:类型断言(快速临时解决)
直接将模型断言为包含rawAttributes的类型,绕过类型检查:
// 方式1:简单断言为any (User as any).rawAttributes; // 方式2:定义更精确的类型 type ModelWithRawAttributes<T> = typeof Model & { rawAttributes: Record<string, import('sequelize').DataType>; }; (User as ModelWithRawAttributes<UserAttributes>).rawAttributes;
方案2:使用官方推荐的模型定义方式(类型安全,推荐)
Sequelize 6推荐通过Model泛型直接定义实例和创建属性类型,同时利用ModelStatic类型获取模型的静态属性(包含rawAttributes):
import { Model, DataTypes, Sequelize, ModelStatic } from 'sequelize'; // 1. 定义属性类型 interface UserAttributes { id: number; name: string; email: string; } // 2. 定义创建属性(忽略自动生成的id) interface UserCreationAttributes extends Omit<UserAttributes, 'id'> {} // 3. 定义实例类型,继承Model interface UserInstance extends Model<UserAttributes, UserCreationAttributes>, UserAttributes {} // 4. 定义模型,自动推断静态类型 const User = sequelize.define<UserInstance>('User', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, name: DataTypes.STRING, email: DataTypes.STRING, }); // 5. 类型安全地访问rawAttributes (User as ModelStatic<UserInstance>).rawAttributes;
方案3:全局扩展Sequelize类型(全局生效)
创建一个类型声明文件(如src/types/sequelize.d.ts),扩展Model的静态类型,让所有模型都能直接访问rawAttributes:
import { Model, DataType } from 'sequelize'; declare module 'sequelize' { interface ModelStatic<T extends Model> { rawAttributes: Record<string, { type: DataType } & Record<string, any>>; } }
添加后无需断言,直接访问User.rawAttributes即可获得类型提示。
额外建议
如果你的需求是获取模型的属性定义,也可以考虑使用Sequelize官方提供的Model.getAttributes()静态方法,它的类型定义更完善:
User.getAttributes();
内容的提问来源于stack exchange,提问作者rony
相关产品推荐
相关产品推荐

