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

时间:2016-02-09 02:17:36

标签: typescript

而不是专注于为什么,让我们专注于什么。

我想用一个名为WebSocketProxy的用户定义类替换本机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:构造函数WebSocket需要' new'

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

  

未捕获的TypeError:无法构建' WebSocket':请使用' new'运算符,此DOM对象构造函数不能作为函数调用。

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

这种行为让我感到疑惑:

  1. 我应该如何生成我的伪WebSocket? (也许实现而不是扩展?)
  2. 这严格来说是Chrome / Firefox问题吗?或者是微软扩展类型的方法不足?
  3. 试图扩展原生类型只是不好的做法,还是这是一个特例?
  4. 为什么将WebSocket称为Chrome和Firefox中禁止的功能?

1 个答案:

答案 0 :(得分:2)

  

我应该如何制作我的伪WebSocket? (也许实现而不是扩展?)

您可以非常轻松地执行以下操作:

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

这严格来说是Chrome / Firefox问题

铬/火狐

  

尝试扩展本机类型只是不好的做法,或者这是一个特殊情况

特例

  

为什么在Chrome和Firefox中禁止将WebSocket作为禁止使用的功能?

防止用户错误(WebSocket表示new WebSocket(

更多

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