2016-02-09 7 views
0

Вместо того, чтобы сосредоточиться на том, почему, давайте сосредоточимся на том, что.Как расширить тип WebSocket в TypeScript?

Я хотел поменять собственный класс WebSocket на пользовательский класс, называемый WebSocketProxy. Таким образом, в любой момент, когда код на странице попытался создать новый 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. 

машинописи компилятор (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. 

Думая это, безусловно, работать, я был разочарован когда я скопировал это в свой Scratchpad в Firefox и выполнил.

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.

Я не получаю эту ошибку в Крае или Internet Explorer.

Такое поведение оставляет мне интересно:

  1. Как еще должен я произвожу мой псевдо-WebSocket? (Возможно, вместо этого продолжите?)
  2. Это строго проблема Chrome/Firefox? Или метод Microsoft по расширению типов не подходит?
  3. Является ли попытка расширить родной тип просто плохой практикой или это особый случай?
  4. Почему вы вызываете WebSocket как функцию, запрещенную в Chrome и Firefox?

ответ

1

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/Firefox

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 так не легко шпионить.

Смежные вопросы