使用typescript 2使用sequelize model扩展express request request对象

时间:2016-10-17 19:33:01

标签: node.js express typescript namespaces sequelize.js

我有some models,例如:

import * as Sequelize from 'sequelize'; // !

export interface UserAttributes {
    id?: number;
    email?: string;
    googleToken?: string;
}
export interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes {
}
export interface UserModel extends Sequelize.Model<UserInstance, UserAttributes> {
}

// ... model definition

我需要使用 import 语句来使用泛型类型Sequelize.Instance<TInstance, TAttributes>

我怀疑一些中间件将用户实例添加到请求对象(或 req.session 对象,不会遇到)

然后我需要typescript to know我的新扩展,为此我有文件 src / _extra.ts 的内容:

/// <reference path="./models/db.ts" /> -- also does not work
declare namespace Express {
  export interface Request {
    oauthClient: Googleapis.auth.OAuth2; // Googleapis is namespace
    user?: UserInstance; // or ContactsProject.Models.UserInstance;
  }
  export interface Session {/* ... some same */}
}

我需要从模型文件中导入 UserInstance 类型。 Imports打破了我的所有 _extra 命名空间定义,在命名空间内我不能使用导入。 我尝试过创建命名空间 ContactsProject ,但我遇到了同样的问题:如果我使用 imports ,typescript看不到我的命名空间,如果我没有,我无法定义我的 UserInstance 类型。 Sequelize没有声明名称空间。

我只想在我的命名空间中导入一些泛型类型。

我使用的是typescript Version 2.0.3。

1 个答案:

答案 0 :(得分:1)

在文件中使用import语句时,TypeScript会将其视为模块。因此,您在其中声明的任何名称空间将不再是全局名称,而是该模块的本地名称。

导入您的接口,然后将命名空间声明包装在declare global { ... }