Ответ 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 вы найдете много: