在Typescript中覆盖Response.end的正确方法?

时间:2018-01-13 19:04:07

标签: typescript express

我正在为Typescript编写快速会话的替代品(因为我想使用JWT令牌而不是cookie)。

我在覆盖Response.end时遇到了麻烦(为了在处理完请求后保存会话)。

签名如下:

end(cb?: Function): void;
end(chunk: any, cb?: Function): void;
end(chunk: any, encoding?: string, cb?: Function): void;

以下是有效的:

const end: {
                (cb?: Function): void;
                (chunk: any, cb?: Function): void;
                (chunk: any, encoding?: string, cb?: Function): void; 
            } = res.end;

但是,我不确定如何提供与这些呼叫签名匹配的res.end的替换。

express-session似乎覆盖如下:

res.end = function end(chunk, encoding) {

然而,当我尝试提供替代品时:

res.end = function(chunk: any, encoding?: string, cb?: Function)
{

}

编译器呻吟:

error TS2322: Type '(chunk: any, encoding?: string | undefined, cb?: Function | undefined) => void' is not assignable to type '{ (cb?: Function | undefined): void; (chunk: any, cb?: Function | undefined): void; (chunk: any, ...'.
  Types of parameters 'encoding' and 'cb' are incompatible.
    Type 'Function | undefined' is not assignable to type 'string | undefined'.
      Type 'Function' is not assignable to type 'string | undefined'.
        Type 'Function' is not assignable to type 'string'.

第一个定义确实可以正常工作:

res.end = function(cb?: Function): void
{

}

非常感谢任何建议!

更新:我发现我可以通过将Response对象转换为 any 来解决此问题:

(<any>res).end = function(chunk: any, encoding?: string): void
{
    end.call(res, chunk, encoding);
};

然而,我原来的问题仍然存在:有没有办法以打字的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

第二个参数可以是编码(字符串)或回调(Function)。您提供的方法不考虑该方案。此外,无法保证第一个参数将存在。你需要这样做:

res.end = function(chunk?: any, encodingOrCb?: string | Function, cb?: Function): void {

}