gpt4 book ai didi

typescript - 我应该如何在 TypeScript 中扩展 WebSocket 类型?

转载 作者:搜寻专家 更新时间:2023-10-30 21:42:49 25 4
gpt4 key购买 nike

与其关注原因,不如关注内容。

我想用名为 WebSocketProxy 的用户定义类替换 native WebSocket 类。这样,每当页面上的代码尝试创建一个新的 WebSocket 时,它实际上都会返回一个新的 WebSocketProxy(我有我的理由)。

为了以我写的最简单的形式测试它:

class WebSocketProxy extends WebSocket {

constructor(url: string, protocols?: string | string[]) {
super(url, protocols);
/* Add hooks here. */
}
}

WebSocket = WebSocketProxy; // Swap native WebSocket with WebSocketProxy.

TypeScript 编译器 (Visual Studio 2015) 将其翻译成:

var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var WebSocketProxy = (function (_super) {
__extends(WebSocketProxy, _super);
function WebSocketProxy(url, protocols) {
_super.call(this, url, protocols); // This is what causes the error.
/* Add hooks here. */
}
return WebSocketProxy;
})(WebSocket);
WebSocket = WebSocketProxy; // Swap native WebSocket with WebSocketProxy.

当我将它复制到 Firefox 中的 Scratchpad 并执行时,我认为这肯定会起作用,但我很失望。

TypeError: Constructor WebSocket requires 'new'

我在 Chrome 中执行相同操作时遇到类似(但更有用)的错误:

Uncaught TypeError: Failed to construct 'WebSocket': Please use the 'new' operator, this DOM object constructor cannot be called as a function.

我在 Edge 或 Internet Explorer 中没有收到此错误。

这种行为让我想知道:

  1. 还应该如何生成我的伪 WebSocket? (也许实现而不是扩展?)
  2. 这严格来说是 Chrome/Firefox 的问题吗?还是 Microsoft 扩展类型的方法不足?
  3. 尝试扩展原生类型只是一种不好的做法,还是一种特殊情况?
  4. 为什么在 Chrome 和 Firefox 中禁止调用 WebSocket 作为函数?

最佳答案

How else should I produce my pseudo-WebSocket? (Perhaps implement instead of extend?)

您可以很容易地完成以下操作:

const OrigWebSocket = WebSocket;
WebSocket = function(url: string, protocols?: string | string[]){
const self = new OrigWebSocket(url,protocols);
/* Add hooks here. */
return self;
} as any;

Is this strictly a Chrome/Firefox issue

Chrome /火狐

Is attempting to extend a native type simply bad practice, or is this a special case

特例

Why is calling WebSocket as a function forbidden in Chrome and Firefox?

为了防止用户错误( WebSocket 当他们意味着 new WebSocket( )

更多

这与 https://github.com/sinonjs/sinon/issues/743 非常相似基本上,用 new 调用是非常吝啬的,所以不容易被窥探。

关于typescript - 我应该如何在 TypeScript 中扩展 WebSocket 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35282843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com