Вместо того, чтобы сосредоточиться на том, почему, давайте сосредоточимся на том, что.Как расширить тип 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.
Такое поведение оставляет мне интересно:
- Как еще должен я произвожу мой псевдо-WebSocket? (Возможно, вместо этого продолжите?)
- Это строго проблема Chrome/Firefox? Или метод Microsoft по расширению типов не подходит?
- Является ли попытка расширить родной тип просто плохой практикой или это особый случай?
- Почему вы вызываете WebSocket как функцию, запрещенную в Chrome и Firefox?