Как переписать '__extends = function () {}' на объект - PullRequest
0 голосов
/ 16 февраля 2020

Прежде всего извините, что название не имеет смысла. Вот что я имею в виду, плюс TL; DR в конце.

Я использую библиотеку tslib от Microsoft, здесь - полный исходный код для контекста. Мне нужно было внести некоторые незначительные изменения в библиотеку, чтобы она работала с моим проектом, поэтому я скопировал код в файл и отредактировал его там. Модифицированный код работает с проектом React, над которым я работал ранее, но он разрывается с React Native из-за следующих строк:

(function (exporter) {

   // some irrelevant stuff

    __extends = function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
});

(я не изменял эту часть, вы можете найти его в строке 66 в исходный исходный код)

Когда React Native пытается скомпилировать это в нативный код, происходит сбой с сообщением об ошибке Prototype value can only be an object or null с ошибкой, исходящей из назначения __extends = function(d, b) {.

Итак, я каким-то образом нужно преобразовать эту внутреннюю анонимную функцию в объект, проблема в том, что, хотя я работал с JavaScript целую вечность, я действительно понятия не имею, что должен делать этот код. Я парень из ES6 +, это похоже на египетские иероглифы. Могут ли некоторые из вас JS ветераны прийти и спасти меня, пожалуйста?

TL; DR: Мне как-то нужно преобразовать __extends = fuction() {} в объект, который будет выполнять ту же функцию, что и функция.

1 Ответ

2 голосов
/ 16 февраля 2020

Это действительно старый шаблон, используемый для настройки наследования классов. Подобную вещь можно найти здесь . Использование new __() предшествует существованию Object.create. Вы должны быть в состоянии заменить вещь на

function __extends(d, b) {
    extendStatics(d, b);
    d.prototype = b === null
      ? Object.create(b)
      : Object.assign(Object.create(b.prototype), {constructor: d});
}
...