【问题标题】:How to extend @types/express request interface?如何扩展@types/express 请求接口?
【发布时间】:2018-12-07 18:08:54
【问题描述】:

虽然人们提出了类似的问题,但这些答案都没有解决我的问题。我在 TypeScript 2.9.2 中,正在尝试将上下文对象添加到 Express Request 对象。我想在.d.ts 文件中执行此操作。

我目前拥有的是: express.d.ts

declare namespace Express {
    interface Request {
        context: any;
    }
}

但是,它不会编译,因为 `Property 'context' 在类型 'Request' 上不存在。

在我的其他文件中,Webstorm 声称请求类型是从正确的文件中导入的。

我的印象是我可以利用声明合并而不必导入或导出类型定义。

这不正确吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    只需稍作修改即可:

    declare namespace Express {
        export interface Request {
            context: any;
        }
    }
    

    当我们在命名空间中定义一个接口(或者实际上,从常量到类的任何东西)时,默认情况下它只对同一命名空间的成员可见,如handbook 中所述。通过添加export,我们让TypeScript 知道这个接口必须被外部代码使用,它会被正确地合并到现有的声明中。

    这不是真正的导出,因为它来自模块(在顶层),因为命名空间本身是declared,而不是exported。所以你只需像往常一样从模块中导入它:

    import * as express from 'express';
    

    【讨论】:

      【解决方案2】:

      使用当前版本的 TypeScript,您无需创建 .d.ts 文件。

      import express from "express";
      
      export type MyRequest = express.Request & {
        context?: any;
      };
      

      然后用它代替常规的请求对象:

      app.use(function (req: MyRequest, res: Response, next: NextFunction) {
        req.context = {};
        next();
      }
      

      【讨论】:

        猜你喜欢
        • 2017-11-23
        • 2021-01-07
        • 1970-01-01
        • 2019-05-30
        • 2020-05-15
        • 2012-09-01
        • 1970-01-01
        • 2021-01-12
        • 2022-01-14
        相关资源
        最近更新 更多