我正在为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);
};
然而,我原来的问题仍然存在:有没有办法以打字的方式做到这一点?
答案 0 :(得分:1)
第二个参数可以是编码(字符串)或回调(Function)。您提供的方法不考虑该方案。此外,无法保证第一个参数将存在。你需要这样做:
res.end = function(chunk?: any, encodingOrCb?: string | Function, cb?: Function): void {
}