Необходимо уточнить параметры компилятора target и lib

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

Я наивно полагал, что target указывает версию JS, которую должен выполнять выходной код (с добавлением загрузчика модуля). Таким образом, мы всегда можем использовать все расширенные функции JS (например, распространение объектов), которые TS поддерживает в нашем источнике, и компилятор генерирует подходящий код для заданного вами объекта. Я предполагаю, что у него были полисы и т.д., И код просто запускался на целевой виртуальной машине.

Однако документы docs для параметра lib указывают, что libs по умолчанию зависит от цели. Но, libs влияют на то, какие типы источников доступны, и поэтому влияют на то, какой код мы можем использовать. Таким образом, возможности источника, которые мы можем использовать, зависят от цели. Это не так, как я ожидал. Я должен сказать, что мое понимание lib заключается в том, что они являются типизациями с другим API, хотя документы действительно не говорят, что они собой представляют.

Я вижу, что здесь есть некоторые языковые функции, которые не зависят от типов и других. Однако неясно, является ли эта часть причины этой ситуации.

Кто-нибудь может прояснить это?

Вторичный вопрос: почему есть ES6 и ES2015 lib, когда они обычно документируются как одно и то же.

спасибо

Ответ 1

(Это началось как комментарий, но он слишком длинный.)

Это немного сбивает с толку, потому что там есть какая-то история. Я не компетентен, чтобы ответить на это авторитетно, но я следовал за TypeScript с раннего развития, и это мое понимание:

  • --target сообщает компилятору, какую версию библиотеки включить во время компиляции (например, ES5 даст ошибку компилятора, если вы используете Promise, но ES6 будет знать все о Promise) и какую версию JS испускается компилятором (например, ES5 будет скомпилировать синтаксис класса, но ES6 оставит его).
  • --lib был добавлен позже, чтобы дать вам лучший контроль над тем, какую версию библиотеки использовать при компиляции, не изменяя испущенную цель JS. Например, общая проблема заключалась в том, что вы можете включать в себя полисы для функций библиотеки ES6, такие как Promise, но вы хотите настроить таргетинг на ES5-браузеры с помощью компиляции синтаксиса class. Перед тем, как --lib был вокруг вас, вам нужно было нацелиться на ES6, чтобы избежать ошибок компиляции в Promise, затем скомпилировать снова с помощью Babel, или вы можете настроить таргетинг ES5 и предоставить свое собственное определение типа для Promise, чтобы компилятор не дает вам ошибки. Теперь с помощью --lib вы можете просто сказать свои --target ES5 и --lib ES6, а компилятор не будет жаловаться на Promise, но все же скомпилировать до ES5.
  • Ни один из вариантов не заставит TS генерировать любые библиотечные полиполки (Promise и т.д.), как вы, очевидно, обнаружили; это ваша ответственность за предоставление правильных библиотек времени исполнения. Он испускает только несколько помощников по языковой совместимости ниже уровня, например __extends и __awaiter (разница состоит в том, что class или async - это не просто API, который может быть заполнен во время выполнения, это языковая функция с синтаксисом последствия). Опция --lib - это просто ваш способ получить правильный уровень проверки компиляции на основе того, что вы знаете, что у вас будет во время выполнения.
  • Что касается причин как для ES6, так и для ES2015, просто потому, что ECMAScript изменил имя и TS оставил старое имя в качестве допустимого параметра для обратной совместимости.:)

В этих проблемах с TS вы найдете много: