【问题标题】:Augmenting existing interfaces增强现有接口
【发布时间】:2016-08-07 18:07:54
【问题描述】:

这不是一个特定的 koa 问题,即使所有代码都使用 koa,我只是节点和模块系统的新手。
使用 Koa 时,每个请求都由 Request interface 定义:

declare module "koa" {
    namespace Koa {
        ...

        export interface Request {
            ...
        }
        ...
    }
    ...
    namespace Koa {}
    export = Koa;
}

我正在使用 bodyparser 中间件,所以 Request 有一个名为 body 的属性,但 typescript 不知道这一点,所以我试图通过添加这个定义文件作为参考来添加它:

/// <reference path="globals/koa/index.d.ts" />
/// <reference path="koa.d.ts" />

import koa = require("koa");
...
app.use(ctx => {
    console.log(ctx.request.body); // error: Property 'body' does not exist on type 'Request'
});

koa.d.ts 在哪里:

declare module "koa" {
    namespace Koa {
        export interface Request {
            body: any;
        }
    }

    export default Koa;
}

但这可能是错误的方法,因为它不起作用。
怎么办?
谢谢。

【问题讨论】:

    标签: node.js typescript koa


    【解决方案1】:

    我只需要解决这个问题。我将此添加到我的custom-typings.d.ts

    import {Request} from "koa";
    
    declare module "koa" {
      interface Request {
        body: any;
      }
    }
    

    【讨论】:

    • 问题是如何将它放在一个我可以使用的文件中,这样我就不需要在我使用 koa 请求的每个文件中都这样做?
    【解决方案2】:

    刚刚碰到这个。我发现因为我使用的是 koa-bodyparser 中间件,所以我需要安装 @types/koa-bodyparser 模块来为你增加界面 - https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/koa-bodyparser/index.d.ts#L20

    import * as bodyparser from 'koa-bodyparser'; 
    ...    
    app.use(bodyParser());
    

    然后,在您的路由中,“body”将在请求对象上可用。

    ctx.request.body
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-05
      • 2015-05-08
      • 1970-01-01
      • 2013-02-19
      • 2012-07-11
      • 2011-11-12
      • 2015-10-23
      相关资源
      最近更新 更多