打字稿中重写XMLHttpRequest.prototype.open失败

时间:2018-10-12 14:27:23

标签: typescript override

我想在Typescript中重写XMLHttpRequest.prototype.open,但这对我来说是失败的,是否有解决方法?

(function(open) {
  XMLHttpRequest.prototype.open = (method, url, async, user, pass) => {
    url = new URL(url);
    if (window["_keycloak"] && window["_keycloak"].token)
      url.searchParams.set('token', window["_keycloak"].token);
    open.call(this, method, url, async, user, pass);
  };
})(XMLHttpRequest.prototype.open);

这是我收到的错误消息

  

[ts]类型'(方法:任意,URL:任意,异步:任意,用户:任意,通过:任意)=> void'不能分配给类型'{(方法:字符串,URL:字符串):虚空(方法:字符串,URL:字符串,异步:布尔值,用户名?:字符串,密码?:字符串):void; }'。

2 个答案:

答案 0 :(得分:1)

由于@Matt的建议,我来找到解决方案。 实际上,如果您查看XMLHttpRequest接口,则会为open方法提供两种实现方式

open(method: string, url: string): void;
open(method: string, url: string, async: boolean, username?: string | null, password?: string | null): void;

因此解决方案是通过添加可选参数来覆盖第一个。 这是最终的解决方案:

(function(open) {
  XMLHttpRequest.prototype.open = (method: string, url: any , async?: boolean, username?: string, password?: string) => {
    url = new URL(url);
    if (window["_keycloak"] && window["_keycloak"].token)
    url.searchParams.set('token', window["_keycloak"].token);
    open.call(this, method, url, async, username, password);
  };
})(XMLHttpRequest.prototype.open);

使异步,用户名和密码可选功能解决了该问题。

答案 1 :(得分:0)

如果您查看错误消息,则原始username的{​​{1}}和password参数是可选的(XMLHttpRequest.prototype.open标记),但是在您的实现中,它们是是必需的,因此您的实现与忽略那些参数的调用者在类型上不兼容。只需将?user参数标记为可选。