用typescript编写egg app时,如何正确使用egg-sequelize插件?
发布于 6 年前 作者 athrunsun 6542 次浏览 来自 问答

当我引入新的plugin egg-sequelize后,如何告诉ts编译器Application interface里面有个model属性呢?我在plugin.ts中激活了插件,在config.local.ts中添加了数据库连接信息,但是当我在app/model中添加新的model定义时,编译器无法找到app.modelapp.Sequelize,我的model文件是这样写的:

import { Application } from 'egg';

export default (app: Application) => {
    const { STRING, INTEGER, DATE, DECIMAL } = app.Sequelize;

    const Food = app.model.define(...);
	...
}

egg-sequelize已经有ts定义了(index.d.ts),我该怎样做才能正常使用app.modelapp.Sequelize呢?

4 回复

定义的model有问题,model应该和controller,service那样有属性的,

declare module 'egg' {
    interface Application {
        Sequelize: SequelizeStatic,
        model: Sequelize & IModel
    }
    interface Context {
        model: IModel
    }
	interface IModel{
		user:UserModel
	}
// model.ts
// 结构
export interface UserObject extends BaseObject {
    account: string,
	userName?: string,
    password?: string
}

// 实例
export interface UserInstance extends Instance<UserObject>, UserObject {

}

// 模型
export interface UserModel extends Model<UserInstance, UserObject> {
	// 关联模型没提示,要加些setXXX,getXXX之类的
}

基本可以解决egg-sequelize大部分问题,就是麻烦的要死

可以参考下我正在写的开源项目刚刚起步,还没完成

@liuzhiguo11 谢谢你的code snippets!我在SO上找到了这个,我发现在项目的typings/index.d.ts里面加一句import 'egg-sequelize';就可以触发declaration merging,编译器就能识别到app.modelapp.Sequelize了。在这个问题上我对declaration merging的理解对吗?

@atzcl 谢谢你提供的示例项目,我先看看。这个项目是你的playground还是说你想把它打造成一个正式开源项目呢?

@athrunsun 正式的开源项目,想做一个多模块的应用(会员中心、CMS、商城、微信系等),后端会分别用 PHPNodeJSGo 实现,配套的后台前端会分别用 VueReact 实现。。。 想得很多,但是精力有限,更新可能会比较慢

回到顶部