如果我尝试扩展一个函数而不扩展整个类。
因此,在此NodeJS http module
中,我想重新定义response.end
函数,执行我的逻辑,并最后调用原始的response.end
。
问题在于end函数具有3个重载。因此,我不能将其与rest参数“ args”一起应用。我已经尝试了所有可能的参数元组的联合类型,但仍然没有用。
错误提示:
Type '(...args: [any, (string | undefined)?, ((() => void) | undefined)?] |
[any, ((() => void) | undefined)?] | [any]) => void' is not assignable to
type '{ (cb?: (() => void) | undefined): void; (chunk: any, cb?: (() =>
void) | undefined): void; (chunk: any, encoding?: string | undefined, cb?:
(() => void) | undefined): void; }'.
Types of parameters 'args' and 'cb' are incompatible.
Type '[((() => void) | undefined)?]' is not assignable to type '[any,
(string | undefined)?, ((() => void) | undefined)?] | [any, ((() => void) |
undefined)?] | [any]'.
Type '[((() => void) | undefined)?]' is not assignable to type '[any]'.
Property '0' is optional in type '[((() => void) | undefined)?]' but
required in type '[any]'.
AND
Argument of type '[any, (string | undefined)?, ((() => void) | undefined)?]
| [any, ((() => void) | undefined)?] | [any]' is not assignable to
parameter of type '[any, (string | undefined)?, ((() => void) |
undefined)?]'.
Type '[any, ((() => void) | undefined)?]' is not assignable to type '[any,
(string | undefined)?, ((() => void) | undefined)?]'.
Types of property '1' are incompatible.
Type '(() => void) | undefined' is not assignable to type 'string |
undefined'.
Type '() => void' is not assignable to type 'string'.
我当前的解决方法是使用@ ts-ignore装饰器:
const end = res.end;
res.end = function(...args: any[]): void {
// .....
res.end = end;
// @ts-ignore, apply any[] args as end has several overloads
res.end.apply(this, args);
// ......
};
我希望工作的代码是通过将args定义为所有重载参数元组的联合类型:
res.end = function(...args: [any, string?, (() => void)?] | [any, (() =>
void)?]): void {
// my logic ....
res.end = end;
res.end.apply(this, args);
// rest of my logic
};