Расширение запроса в машинописной компиляции в ES5 с помощью TypeError - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь расширить класс Request в Typescript следующим образом:

export class ApiRequest extends Request {
    static userAgentHeader: string = '';
    static xUserAgentHeader: string = '';

    public body: string;

    constructor(url: string, initialData?: any) {
        super(url, initialData);

        if (this.method !== 'GET') {
            this.body = initialData._bodyText;
        }

        this.headers.set('User-Agent', ApiRequest.userAgentHeader);
        this.headers.set('X-User-Agent', ApiRequest.xUserAgentHeader);
    }

    static setAgentHeader(userAgentHeader: string) {
        ApiRequest.userAgentHeader = userAgentHeader;
    }

    static setXUserAgentHeader(xUserAgentHeader: string) {
        ApiRequest.xUserAgentHeader = xUserAgentHeader;
    }
}

Однако при переносе в ES5 я получаю следующий фрагмент кода:

import * as tslib_1 from "tslib";
var ApiRequest = /** @class */ (function (_super) {
    tslib_1.__extends(ApiRequest, _super);
    function ApiRequest(url, initialData) {
        var _this = _super.call(this, url, initialData) || this;
        if (_this.method !== 'GET') {
            _this.body = initialData._bodyText;
        }
        _this.headers.set('User-Agent', ApiRequest.userAgentHeader);
        _this.headers.set('X-User-Agent', ApiRequest.xUserAgentHeader);
        return _this;
    }
    ApiRequest.setAgentHeader = function (userAgentHeader) {
        ApiRequest.userAgentHeader = userAgentHeader;
    };
    ApiRequest.setXUserAgentHeader = function (xUserAgentHeader) {
        ApiRequest.xUserAgentHeader = xUserAgentHeader;
    };
    ApiRequest.userAgentHeader = '';
    ApiRequest.xUserAgentHeader = '';
    return ApiRequest;
}(Request));
export { ApiRequest };
//# sourceMappingURL=ApiRequest.js.map

Проблема возникает при попытке создать ApiRequest объект путем вызова new ApiRequest(url), Uncaught TypeError выдается со следующим сообщением:

Uncaught TypeError: Не удалось создать 'Запрос': Пожалуйста, используйте 'Оператор new ', этот конструктор объекта DOM не может быть вызван как функция.at eval (eval at ApiRequest (ApiRequest.js: 5),: 1: 1)

Похоже, что Request нельзя вызывать без ключевого слова new, но переданный код выполняет толькочто в строке 5 (_super.call()).

Есть ли способ как-нибудь заставить это работать?

1 Ответ

0 голосов
/ 25 апреля 2018

Решение, которое наконец-то сработало, - обернуть Request классоподобной функцией:

export const RequestWrapper: RequestWrapper = function(url: string, initialData?: any) {
    return new Request(url, initialData);
} as any;

export interface RequestWrapper extends Request {
    (url: string, initialData?: any): Request;
    new (url: string, initialData?: any): Request;
}

Тогда просто расширьте RequestWrapper вместо Request:

export class ApiRequest extends RequestWrapper {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...