[eggjs/egg]ts项目中,使用Sequelize定义Model之后,有类型相关的报错无法启动。

2025-11-04 680 views
6
What happens?

按照官网文档生成 ts 项目,使用 egg-sequelize ,按照文档定义一个User Model,启动会报错,报错大概是app.model.definedefine不存在,好像是生成的类型影响到了model?

复现步骤,错误日志以及相关配置 npx egg-init --type=ts showcase npm install --save egg-sequelize mysql2 并且做好相关配置 在 app/model/user.ts 中定义User Model

import { Application } from 'egg';

module.exports = (app: Application) => { const { STRING, INTEGER, DATE } = app.Sequelize; const User = app.model.define('user', { id: { type: INTEGER, primaryKey: true, autoIncrement: true }, name: STRING(30), age: INTEGER, created_at: DATE, updated_at: DATE, });

return User;

};

执行 npm run dev,报错, 关键错误日志:
TSError: [egg-core] load file: PATH/TO/showcase/app/model/user.ts, error: ⨯ Unable to compile TypeScript:
app/model/user.ts(5,28): error TS2339: Property 'define' does not exist on type 'Sequelize'.

生成的 typings 目录中 app/model/index.d.ts:

// This file is created by egg-ts-helper@1.25.3 // Do not modify this file!!!!!!!!!

import 'egg'; import ExportUser from '../../../app/model/User';

declare module 'sequelize' { interface Sequelize { User: ReturnType; } }


<!-- 请提供复现步骤,错误日志以及相关配置 -->
<!-- 可以尝试不要锁版本,重新安装依赖试试先 -->

## 相关环境信息
- **操作系统**:macOS 10.12.6 
- **Node 版本**:10.14.2
- **Egg 版本**:2.22.2
- TypeScript: 3.5.1
- egg-sequelize: 5.0.0

回答

8

已知问题,PR 已经提了:https://github.com/eggjs/egg-sequelize/pull/73

3
interface IModel extends sequelize.Sequelize, PlainObject { }

试了一下,这个IModel,是不是有点不对?app.model 对应的 Sequelize实例里面的方法都是any了。 @whxaxes

8

@atomoo 感谢反馈,我看看

7

@atomoo 已更正,不能用 [key: string]: any ,果然还是会出问题

1

这样启动不会报错了,但是vscode里面有错误,不明白是怎么回事。 egg-sequelize的d.ts里面,vscode 好像是把sequlize.Sequelize识别为typings/app/model/index.d.ts里面的定义,然后就报错。 @whxaxes

5

你看下我加的单测,单测 fixtures 里有相关使用,参考我那个

7

嗯, OK了,thx。 是生成的typings有问题,我应该先更新下 egg-ts-helper 的?,更新了 egg-ts-helper 之后,之前的any的问题也不会有。sry

1

egg-squelize 已合并发布 5.0.1 ,重装一下依赖即可

7

已知问题,PR 已经提了:eggjs/egg-sequelize#73

@whxaxes 新建model在typings中也生成对应的.d.ts文件,但是在willReady周期中里this.app.model还是报错是什么原因?