扩展TypeScript声明文件

时间:2016-05-29 03:30:05

标签: express typescript typescript-typings

我正在尝试使用TypeScript和Express。我已经加载了Typings的类型声明,它们看起来像这样:

// Generated by typings
// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/7de6c3dd94feaeb21f20054b9f30d5dabc5efabd/express/express.d.ts
declare module "express" {
    import * as serveStatic from "serve-static";
    import * as core from "express-serve-static-core";

    /**
     * Creates an Express application. The express() function is a top-level function exported by the express module.
     */
    function e(): core.Express;

    namespace e {

        /**
         * This is the only built-in middleware function in Express. It serves static files and is based on serve-static.
         */
        var static: typeof serveStatic;

        export function Router(options?: any): core.Router;

        interface Application extends core.Application { }
        interface CookieOptions extends core.CookieOptions { }
        interface Errback extends core.Errback { }
        interface ErrorRequestHandler extends core.ErrorRequestHandler { }
        interface Express extends core.Express { }
        interface Handler extends core.Handler { }
        interface IRoute extends core.IRoute { }
        interface IRouter<T> extends core.IRouter<T> { }
        interface IRouterMatcher<T> extends core.IRouterMatcher<T> { }
        interface MediaType extends core.MediaType { }
        interface NextFunction extends core.NextFunction { }
        interface Request extends core.Request { }
        interface RequestHandler extends core.RequestHandler { }
        interface RequestParamHandler extends core.RequestParamHandler { }
        export interface Response extends core.Response { }
        interface Router extends core.Router { }
        interface Send extends core.Send { }
    }

    export = e;
}

现在我正在尝试为所有Response对象扩展原型,如下所示:

const express = require('express');
express.response.sendWrapped = function(obj: Object, meta?: Object) {
    return this.json({
        data: obj
    });
};

现在我只需要将扩展​​插入到打字中。我很乐意将这个方法扩展到现有的定义中,就像我在原型中扩展它一样,但我不确定如何这样做。

由于这是图书馆类型定义的个人扩展,我认为这属于主要打字集,我应该必须修改他们手动为我自己的目的。以我自己的方式扩展它们的最佳方法是什么?我是否可以在不重写依赖于响应的其他所有部分的情况下进行此操作?

2 个答案:

答案 0 :(得分:2)

使用TypeScript 2.0或其预发行版(typescript@next),您可以使用模块扩充语法来扩充express的定义,以包含新的response定义:

import express = require('express');

declare module "express" {
    namespace response {
        function sendWrapped(obj: any, meta?: any): void;
    }
}

express.response.sendWrapped = function(obj: Object, meta?: Object) {
    return this.json({
        data: obj
    });
};

答案 1 :(得分:0)

一些事情:

(1)您所包含的声明中没有response,其中包含Response,因此它应为:express.Response.sendWrapped

(2)你没有扩展所有Response的原型,你将sendWrapped函数添加到类本身(我假设Response是一个类)。 /> 如果要添加到原型,它应该如下所示:

express.Response.prototype.sendWrapped = function(obj: Object, meta?: Object) {
    return this.json({
        data: obj
    });
};

(3)您可以像这样添加现有类型:

namespace express {
    interface Response {
        sendWrapped(obj: Object, meta?: Object): any;
    }
}

Declaration Merging

中有关于此的更多信息

修改

如果它在d.ts文件中,那么您需要它:

declare namespace express {
    ...
}

我不确定为什么它不会让你合并声明我没有这个设置来自己测试它,但是我有另一个解决方案,就是在我的意见,更好。

只需扩展express.Response即可添加您需要的内容,例如:

class MyResponse extends express.Response {
    constructor() {
        super();
    }

    sendWrapped(obj: Object, meta?: Object): express.Response {
        return this.json({
            data: obj
        });
    }
}

这样做更好,因为你并不像快速api中的变化那样容易受到攻击,更重要的是,这就是面向对象的目的。