Конфигурация TypeScript по умолчанию в Angular 11: цель «es2015», библиотека «es2018», но без полифилла?

При загрузке свежего приложения Angular 11 будет создан следующий файл tsconfig.json:

{
  "compileOnSave": false,
  "compilerOptions": {
    ... // Options not relevant for this question.
    "target": "es2015",
    "module": "es2020",
    "lib": [
      "es2018",
      "dom"
    ]
  }

Он также генерирует файл polyfills.ts только с включенным/раскомментированным zone.js.

Мой вопрос: поскольку мы компилируем в es2015, но используем определения типов es2018 (например, async iterables, promise.finally и т. д.), как это может быть безопасно, если не предоставляются связанные полифилы? Почему Angular 11 CLI не использует es2015 для lib?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
2 327
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Угловые полифиллы автоматически генерируются как polyfills-es5.js. В этом файле находятся полифилы, которые необходимы для внутренней работы angular. Если ваш код использует функции, которые не являются частью того, что использует angular, вам нужно добавить это в файл polyfills.ts.

Поскольку целью является es2015, typescript автоматически преобразует некоторые функции es2018, например, async.

es2015 автоматически включается как библиотека, потому что это подмножество es2018 (я полагаю).

Примечание: Если бы вы использовали es2018 вместо target, angular выдал бы предупреждение при компиляции, потому что нативный async/await не может быть захвачен zone.js. Это не проблема, если вы везде используете OnPush

Спасибо за Ваш ответ. Я думаю, что я получил это сейчас! Angular на самом деле хотел бы настроить таргетинг на es2018, но не может из-за проблемы с захватом async-await. Таким образом, вместо этого он нацелен на es2015, но по-прежнему хочет, чтобы программист использовал другие интересные es2018 функции. Для этого он просто указывает es2018 как lib, зная, что предполагаемая версия среды выполнения (например, браузер) будет поддерживать эти функции. Вы можете это подтвердить?

domin 11.12.2020 13:03

@domin Это правильно, но если вы используете функции, которые есть в es2018, которые нельзя перенести с помощью машинописного текста в es2015 и которые не используются основной структурой angular, вам необходимо включить их в свой polyfills.ts

Poul Kruijt 11.12.2020 15:11

Я так не думаю. Если я использую функцию ES2018 Promise.prototype.finally, мне не нужно включать какие-либо полифиллы, и мое приложение по-прежнему нормально работает в современных браузерах.

domin 12.12.2020 16:23

@domin что-то подобное нельзя передать машинописным текстом. async/await можно. Современные браузеры поддерживают finally, поэтому, очевидно, вам не нужно включать его в свои полифилы :) Попробуйте запустить его в IE11, и я уверен, что вам придется его добавить.

Poul Kruijt 12.12.2020 17:55

Разве Promise.finally не является стандартным вызовом метода, как и любой другой, и поэтому может быть скомпилирован TS? Существует ли он во время выполнения — другой вопрос. Это работает в современном браузере, поддерживающем ES2018, но не в IE11, который требует полифилла, правильно!

domin 13.12.2020 10:16

@domin, потому что это стандартный метод, переноса не произойдет. Транспиляция происходит с языковыми функциями, такими как await/async или необязательной цепочкой ?.. Методы объекта никогда не транспилируются для определенной цели и должны быть добавлены в полифиллы, если ваше приложение должно работать в браузерах, которые его не поддерживают. Я думаю, это лучшее объяснение :D

Poul Kruijt 13.12.2020 16:57

Я думаю, что мы просто не согласны с термином «транспиляция». Если я пишу программу X исключительно в синтаксисе ES2015, она является действительной TS, поскольку TS (синтаксически) является надмножеством ES2015. Если я запускаю компилятор TS поверх X, я получаю X без изменений. Я бы все же сказал, что X был перенесен в X. ;)

domin 13.12.2020 17:07

Кстати: вы говорите, что невозможность исправления нативного async/await с помощью zone.js не является проблемой при использовании стратегии обнаружения изменений onpush. Почему это так? Angular все еще нужно выяснить, изменились ли какие-либо входные ссылки. Однако когда он делает эту проверку?

domin 13.12.2020 20:48

@domin эти проверки выполняются в декораторе @Input (я думаю, по крайней мере, я бы так сделал). Вход преобразуется в сеттер и геттер. И когда он установлен, компонент помечен как грязный

Poul Kruijt 13.12.2020 20:56

О, это имеет смысл! :) Большое спасибо за ваши ответы!

domin 13.12.2020 21:03

Другие вопросы по теме