Как скомпилировать классы TypeScript с помощью @ babel / preset-typescript? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь скомпилировать библиотеку классов TypeScript для ES5, используя комбинацию @ babel / preset-typcript и @ babel / env. Без каких-либо плагинов это приводит к ошибке компиляции:

SyntaxError: C:\projects\time\git\core\main\src\LocalDate.ts: Missing class properties transform.
  35 | class LocalDate {
  36 |
> 37 |  private _weekBasedYear: number = null;
     |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  38 |
  39 |  private constructor(readonly nativeUtc: Date) {
  40 |  }

И вот я застрял. В официальной документации нет ссылки на рекомендуемый плагин преобразования свойств класса. Я пытался использовать @ babel / plugin-offer-class-properties , как это рекомендуется для JS, но, похоже, он не совместим с TypeScript. Например, когда я компилирую следующую пару классов:

abstract class ClassA {

    abstract readonly value: number;
}

export class ClassB extends ClassA {

    get value() {
        return 1;
    }
}

export const B = new ClassB();

Он выдает следующий код JS:

var ClassA = function ClassA() {
  _classCallCheck(this, ClassA);

  _defineProperty(this, "value", void 0);
};

var ClassB = /*#__PURE__*/function (_ClassA) {
  _inherits(ClassB, _ClassA);

  function ClassB() {
    _classCallCheck(this, ClassB);

    return _possibleConstructorReturn(this, _getPrototypeOf(ClassB).apply(this, arguments));
  }

  _createClass(ClassB, [{
    key: "value",
    get: function get() {
      return 1;
    }
  }]);

  return ClassB;
}(ClassA);

exports.ClassB = ClassB;
var B = new ClassB();
exports.B = B;

, в результате чего значение B.value будет неопределенным, а не 1.

Я не могу скомпилировать мой TypeScript напрямую в JS, потому что я использую ES6 API, а компилятор TypeScript отказывается компилировать его использование для меня.

src/Zone.ts(51,14): error TS2339: Property 'isFinite' does not exist on type 'NumberConstructor'.
src/Zone.ts(58,10): error TS2339: Property 'startsWith' does not exist on type 'string'.
src/Zone.ts(143,15): error TS2339: Property 'isFinite' does not exist on type 'NumberConstructor'.

Я ожидаю Пользователь библиотеки должен присоединить подходящий полифилл, чтобы обеспечить доступность всего этого API, но я не знаю, как объяснить это компилятору TypeScript.

Мой .babelr c:

{
  "plugins": [
    "@babel/plugin-proposal-class-properties"
  ],
  "presets": [
    [
      "@babel/env",
      {
        "targets": {
          "browsers": [
            "last 2 versions",
            "IE >= 11"
          ]
        }
      }
    ],
    "@babel/preset-typescript"
  ],
  "parserOpts": {
    "strictMode": true
  },
  "sourceMaps": "inline"
}

Команда компиляции:

node_modules/.bin/babel --extensions ".ts" src --out-dir dist

Как правильно скомпилировать классы TypeScript в ES5 с Babel?

1 Ответ

0 голосов
/ 12 апреля 2020

Я исправил проблему, скомпилировав проект в два этапа:

node_modules/.bin/tsc
node_modules/.bin/babel --out-dir dist dist-tsc

Необходимо настроить TypeScript для компиляции в ES6 или выше, чтобы убедиться, что шаблон Common JS module не применяется дважды.

С учетом сказанного я понятия не имею, для чего был создан @ babel / preset-typcript.

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