帮eggjs配置sequelizejs的typescript支持

1,646 阅读2分钟

我们知道sequelize是操作数据库的ORM框架,可以将数据库中的表单数据映射成js对象,让我们可以通过javascript来方便快捷的操作数据库,配置一下让他支持typescript的语法提示,下面默认已经安装了eggjs并且配置选用了ts,同时也安装了sequelizejs并进行了相关的配置,只剩下让sequelize支持typescript

分析问题

我们都知道在eggjs项目下运行npm run tsc 会相应的生成typing文件夹, 文件夹下面是typescript的定义文件, eggjs根目录下面的app/model里面就是我们用sequelizejs对表的定义,本文使用app/model/test.ts做配置演示如下图所示

image.png

生成的代码重点如下:

// This file is created by egg-ts-helper@1.25.8
// Do not modify this file!!!!!!!!!
import 'egg';
import ExportTest from '../../../app/model/test';

declare module 'egg' {
  interface IModel {
    // ...
    Test: ReturnType<typeof ExportTest>;
  }
}

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

通过上面的代码我们可以知道使用sequlize操作model的时候用的类型推断是ReturnType<typeof ExportTest>, 我们知道app/model/test.ts返回的是一个函数, ReturnType<T>取得的函数的返回值类型, 只要保证ReturnType<T>是sequelize定义的对象就👌了

解决问题

去这里找一下有没有sequelize的定义文件DefinitelyTyped一般这种流行的框架都会有的,找到了,安装它

yarn add @types/sequelize

开始配置app/model/test.ts,配置如下,重点就是Model<TInstance, TAttributes, TCreationAttributes = TAttributes>, 在sequlize下面Model代表的表对象,TInstance代表行对象,TAttributes代表表里面的字段设置,为什么我知道这些,因为我之前尝试使用sequelize-typescript egg-sequelize运行有点问题,没成功,我就换最原始的方法,顺便看了下定义文件,找到了Model, Instance

image.png

效果如下:

image.png