我想在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; }'。
答案 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
参数标记为可选。