Почему ES7 / polyfill массива требуется несмотря на то, что для цели tsconfig установлено ES5 - PullRequest
1 голос
/ 23 мая 2019

У меня есть следующие настройки в tsconfig.json.Я добавил "es2017", чтобы использовать Array.includes.:

{
  "compilerOptions": {
    "lib": [
      "es6",
      "es2017",
      "dom"
    ],
    "module": "es6",
    "target": "es5"
  }
}

Теперь я понял, что мне нужно добавить import 'core-js/es7/array'; к polyfills.ts, чтобы использовать Array.includes также для Internet Explorer.11. target в tsconfig.json установлено на es5, в котором нет Array.includes.

Зачем мне добавлять полифилл?

1 Ответ

0 голосов
/ 23 мая 2019

TypeScript не автоматически заполняет код . «Официальная» причина из соответствующей проблемы GitHub, как кажется, @RyanCavanaugh сказал :

С помощью компилятора попытайтесь выяснить, какие методы [ES20XX] вам нужны, и где их испускать, и когда, с помощью элементов управления для людей, которые не хотят выдавать полифилы, и способов их изменения. откуда происходят эти полифилы и т. д., это большой беспорядок, который не оправдывается потенциальными преимуществами по сравнению с простым включением обычной библиотеки [ES20XX] полифилла в контекст скрипта.

И, как уже упоминалось в этом выпуске, испускание кода времени выполнения является нецелевым TypeScript:

[Нецель №] 6. Предоставить дополнительные функциональные возможности или библиотеки. Вместо этого используйте TypeScript для описания существующих библиотек.


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

Если в целевой версии новая языковая функция синтаксически неверна , то она либо будет понижена, либо вы получите предупреждение о времени компиляции. Вы не можете заполнить неверный синтаксис. Например, class Foo {} не является и не может быть допустимым кодом ES5 ... поэтому он будет преобразован в функцию конструктора вместо этого при нацеливании на ES5.

Если, с другой стороны, языковая функция синтаксически действительна в целевой версии, она будет отправлена ​​как есть без предупреждения. Так что [1,2,3].includes(0) - это совершенно правильный код ES5 с точки зрения синтаксиса. Предполагая, что кто-то добавляет метод Array.prototype.includes в движок ES5, он даже будет работать во время выполнения. Так что он излучается как есть. Обратите внимание, что когда вы включаете es2017 в ваши параметры компилятора lib, вы сообщаете TypeScript, что среда выполнения будет поддерживать типизацию ES2017, и поэтому предупреждение во время компиляции отсутствует. Добавление библиотек для ввода не влияет на саму среду выполнения ... так что вы отвечаете за полифиллинг / отбрасывание всего, что вам нужно. С точки зрения компилятора он не может справиться с ситуацией, когда вы соврали ему о том, какие методы существуют во время выполнения. Очевидно, что это не слишком утешает человека, разочарованного ошибкой во время выполнения.

Ну да ладно, это то, что есть, я думаю.


Надеюсь, это поможет. Удачи!

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