我想在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; }”。

#1楼 票数: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);

通过使async,用户名和密码成为可选选项可以解决该问题。

#2楼 票数:0

如果您查看错误消息,则原始XMLHttpRequest.prototype.openusernamepassword参数是可选的( ?标记),但是在您的实现中,它们是必需的,因此您的实现与省略那些调用者的类型不兼容。参数。 只需标记您的userpass可选参数即可。

  ask by malek yahyaoui translate from so

未解决问题?本站智能推荐:

2回复

打字稿:覆盖超类方法而无需知道超类方法签名

这是我如何可靠地覆盖 vanilla JS 中的方法而不关心名称或参数数量或返回值:import EventEmitter from 'events'// console.log event + arguments every time this emitter emits anything.//
2回复

TypeScriptArray.prototype.map声明

规格 根据Array.prototype.map()的MDN规范,应该像这样使用map ... 问题 TypeScript有一些map的重载声明,这使得extend Array<T>变得非常困难。 我希望看到这个(在lib.d.ts中) ... 但lib.d.ts
1回复

在Typescript中,如何使用自己的第三方重写librd提供的index.d.ts?

我正在使用index.d.ts文件随附的第三方JavaScript库。 但是,该文件与我的TS版本不兼容。 我已经做出了适合自己的修复程序,并将其提交给了库创建者。 同时,我想使用此修复程序。 我需要将其提交给VCS,以供整个团队使用。 node_modules文件夹未提交给VCS,其
1回复

具有不同参数的继承和重写方法

我有一个继承HTMLElement的接口: 在所有属性上出现错误: 我猜这是因为click是type () => void ,但是它不应该被我的新模式覆盖吗? 如何忽略该错误(如果不需要,我不想重命名属性)?
2回复

在TypeScript中键入由继承方法调用的重写方法(错误?)

我最近偶然发现了以下场景: 这是 TypeScript 类型系统中的错误还是有意为之? 如果是后者,我如何更改类型以便编译器识别问题?
1回复

如何在子类中访问getter的超类值?

访问super一个值getter在派生类中似乎不工作: 我怎样才能正确地重写getter和利用的super价值?
1回复

在扩展类中重新定义实例变量的类型

我有一个关于 typescript 中实例变量的继承和类型的问题。 假设我有一个简单的类,如下所示: 打字稿在这里做你所期望的。 当您尝试创建 sarah 时,它会抱怨:)。 但是现在让我们假设您有另一个类来扩展它,并且您想确保这个类仍然具有实例变量但覆盖了类型。 不幸的是,这并没有真正按预期工作。
1回复

如何在typescript中扩展和覆盖数组方法

现在我想实现一个数组代理。 这是我的代码 似乎没有调用我的覆盖推送方法。 并且foo变量是ArrayProxy以外的Array的实例。 我的打字稿版本:2.3.2 tsconfig.json MyTest的 我寻找一些解决方案,但失败了。 来自David Sherre