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

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"
}

报错原因

  1. Sequelize 6.x的官方TypeScript类型定义中,Model基类默认未暴露rawAttributes这个静态内部属性,尽管它在JavaScript运行时确实存在。
  2. 你使用的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:33:12