Почему параметры отдыха не определены в TypeScript? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть приложение React Native, которое я программирую с помощью TypeScript (3.6.3). У меня есть следующий код (фактический код взят из библиотеки API, но это минимально воспроизводимый пример):

class Base{
    someVal: string[];
    constructor() {
        this.someVal = [];
    }
    someMethod<T extends Base>(this: T, ...someArgs:string[]){
        debugger;
        this.someVal = someArgs;
    }
}

class Derived extends Base{

}

let myVar = new Derived().someMethod('hello');

Код точно имитирует код библиотеки и ведет себя так же (ошибочно). Нет ошибок или предупреждений компилятора. Когда я запускаю код, я ожидаю, что someArgs будет ['hello'], но это undefined. Кроме того, у меня есть массив arguments, который содержит фактическое значение ['hello']:

enter image description here

На данный момент код (который являетсяпереносится Бабелем на лету) действует как Javascript (следовательно, неопределенная фактическая переменная и переменная фантомных аргументов). Почему он не отображается правильно и как мне это исправить? (Я нахожусь на ядре Babel 7.6.2)

Вот соответствующий код из сгенерированного index.bundle:

    var Base = function () {
    function Base() {
      (0, _classCallCheck2.default)(this, Base);
      this.someVal = [];
    }

    (0, _createClass2.default)(Base, [{
      key: "someMethod",
      value: function someMethod() {
        debugger;

        for (var _len = arguments.length, someArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
          someArgs[_key - 1] = arguments[_key];
        }

        this.someVal = someArgs;
      }
    }]);
    return Base;
  }();

  var Derived = function (_Base) {
    (0, _inherits2.default)(Derived, _Base);

    function Derived() {
      (0, _classCallCheck2.default)(this, Derived);
      return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Derived).apply(this, arguments));
    }

    return Derived;
  }(Base);

  var myVar = new Derived().someMethod('hello');

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Почему это не передается правильно и как мне это исправить? (Я нахожусь на Babel core / runtime 7.6.2)

Код передается «правильно» в том смысле, что он будет работать правильно при выполнении, но, как вы видели, он не ведет себякак вы ожидаете при проверке выходного кода с помощью отладчика. К сожалению, нет простого способа обойти это.

someMethod<T extends Base>(this: T, ...someArgs:string[]){
    debugger;
    this.someVal = someArgs;
}

становится

value: function someMethod() {
  debugger;

  for (var _len = arguments.length, someArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
    someArgs[_key - 1] = arguments[_key];
  }

  this.someVal = someArgs;
}

, потому что Babel откладывает генерацию массива someArgs до самого последнего момента перед использованием массива (в данном случаекогда это назначено). В этом случае это будет after ваше debugger утверждение. Это происходит потому, что в функции могут быть ветви, которые никогда не используют someArgs, и преобразование arguments в массив будет пустой тратой производительности, если массив никогда не использовался.

Если вы перейдете впока вы не доберетесь до строки this.someVal = someArgs;, вы увидите, что someArgs имеет ожидаемое вами значение.

0 голосов
/ 07 ноября 2019

По-видимому, это действительно ошибка Babel с открытым PR, который еще не объединен с мастером: https://github.com/babel/babel/pull/9714:

TypeScript «этот параметр» является фальшивым параметром и не долженучитываться при подсчете параметров функции. Этот патч пропускает его, используя условие, взятое из плагина transform-typcript.

Примечание: поскольку плагин transform-typcript удаляет этот тип параметров, включая его, прежде чем плагин transform-parameters решает проблему. Этот патч исправляет проблему в других случаях.

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