【问题标题】:extend express request object with sequelize model using typescript 2使用 typescript 2 使用 sequelize 模型扩展 express 请求对象
【发布时间】:2017-02-26 21:38:28
【问题描述】:

我有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&lt;TInstance, TAttributes&gt;

我编写了一些中间件来将用户实例添加到请求对象(或 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 类型。导入破坏了我所有的 _extra 命名空间定义,在命名空间内我不能使用导入。 我尝试创建命名空间 ContactsProject,但我遇到了同样的问题:如果我使用 imports,打字稿看不到我的命名空间,如果我没有,我无法定义我的命名空间UserInstance 类型。 Sequelize 不声明命名空间。

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

我使用 typescript 2.0.3 版。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,花了很多时间解决这个问题。
    猜你喜欢
    • 2015-11-05
    • 2016-09-19
    • 2021-01-07
    • 2021-06-05
    • 1970-01-01
    • 2019-05-30
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多