Что действительно делает опция "lib" TypeScript?

Я до сих пор не смог найти хороший ответ для этого. Опция "target" определяет, на какой версии Javascript будет выполняться результат. Опция "lib" менее четко описана где угодно. Похоже, это более детальный способ описания целевой среды, но тогда кажется странным, что это влияет на то, что вы можете записать в исходные файлы .ts. Мысль TS, что как надмножество JS, так почему это влияет, например, на Promise() или нет? Кажется, что это не только определяет цель, но также влияет на то, какие функции вы имеете в Typescript. Может кто-то объяснить это прямо или прямо на ответ (его нет на typescriptlang.org или в книгах, на которые я смотрел, например, "Укажите файлы библиотеки, которые будут включены в компиляцию", что абсолютно ничего не объясняет.

Ответ 1

Typescript не имеет встроенных типов, все типы поступают из набора базовых определений (находится в папке lib в каталоге установки typcript). По умолчанию target определяет, какие libs включены. Например, состояние документов :

Примечание. Если значение --lib не указано, вводится список библиотек по умолчанию. Используемые по умолчанию библиотеки:

► For --target ES5: DOM,ES5,ScriptHost

► For --target ES6: DOM,ES6,DOM.Iterable,ScriptHost

Основная идея заключается в том, что, хотя target предназначен для языковых функций (более конкретно, какие языковые функции необходимо компилировать, например: for-of или функции стрелок), опция lib имеет дело с теми возможностями, которые есть в среде выполнения (т.е. как выглядят встроенные объекты, какие они есть).

В идеале следует использовать значение по умолчанию libs для данного target. Однако у нас может быть среда, которая поддерживает некоторые из средств времени выполнения, но не языковые функции, или мы можем ориентировать время выполнения с более низкой версией es и заполнить некоторые из средств времени выполнения, что в целом может быть сделано для некоторые вещи (например, обещания).

Ответ 2

Помните, что TS никогда не внедряет полифиллы в ваш код. Это не его цель. Дополняя ответ выше:

target сообщает TS, какую спецификацию ES вы хотите, чтобы окончательный код поддерживал. Если вы сконфигурируете его как ES5, TS будет компилировать синтаксические функции в ES5, поэтому все функции стрелок (() => {}) в коде будут преобразованы в функции. Но также предполагается, что ваш браузер поддерживает все функциональные возможности ES5 во время выполнения. Например, если в вашем коде есть Array.isArray (функция ES5) и вы пытаетесь открыть свой сайт в IE8, он сломается, потому что не поддерживает это. Вы должны заполнить его, если хотите поддерживать этот браузер.

lib сообщает TS, какие определения типов следует включить в ваш проект. Если у вас есть "target": "es5", значением по умолчанию для lib будет ["dom", "es5", "ScriptHost"]. Это означает, какие функциональные возможности браузер будет поддерживать во время выполнения. Если вы добавляете какие-либо полифилы для вещей выше вашей цели, здесь вы можете настроить эту дополнительную поддержку.

Пример: Вам нужно поддерживать IE11, и в вашем коде есть Promise. IE11 не поддерживает обещания, поэтому вы должны самостоятельно импортировать полифилл в свой код, а затем сказать TS:

"target": "es5",
"lib": ["es5", "dom", "ScriptHost", "es2015.promise"]