Я до сих пор не смог найти на это хорошего ответа. Параметр "target" определяет, на какой версии Javascript будет запущен результат. Вариант "lib" нигде менее четко описан. Похоже, что это более детальный способ описания целевой среды, но тогда кажется странным, что это влияет на то, что вы можете писать в исходных файлах .ts. Мысль TS - это надмножество JS, так почему это влияет на то, например, Promise()
доступен или нет? Похоже, что это не только определяет цель, но также влияет на то, какие функции у вас есть в Typescript. Может ли кто-нибудь объяснить это четко или прямо к ответу (его нет на typescriptlang.org или в книгах, которые я просмотрел, например, «Укажите файлы библиотеки для включения в компиляцию», что абсолютно ничего не объясняет.
Что на самом деле делает опция библиотеки TypeScript?
Ответы (2)
В Typescript нет встроенных типов, все типы происходят из набора базовых определений (расположенных в папке lib
в каталоге установки машинописного текста). По умолчанию target
определяет, какие libs
включены. Например, в docs говорится:
Примечание. Если --lib не указан, вводится список библиотек по умолчанию. Внедренные библиотеки по умолчанию:
► Для
--target ES5: DOM,ES5,ScriptHost
► Для
--target ES6: DOM,ES6,DOM.Iterable,ScriptHost
Основная идея заключается в том, что хотя цель связана с языковыми функциями (точнее, какие языковые функции должны быть скомпилированы, например, for-of или стрелочные функции), параметр lib
касается того, какие возможности есть в среде выполнения (например, какие как выглядят встроенные объекты, какие они есть).
В идеале следует использовать значение по умолчанию libs
для данного target
. Однако у нас может быть среда, которая поддерживает некоторые средства выполнения, но не языковые функции, или мы можем нацелить среду выполнения на более низкую версию es
и заполнить некоторые из средств выполнения, что в целом может быть выполнено для некоторых вещей. (например: обещания).
Promise
- это тип, поэтому то, что я сказал, применимо. TypeScript пытается минимально присутствовать в сгенерированном коде. Вам нужны полифиллы, которые нужно добавить сами
- person Titian Cernicova-Dragomir; 23.06.2018
Помните, TS никогда не внедряет полифиллы в ваш код. Это не его цель. Дополняя ответ выше:
target
сообщает TS, какую спецификацию ES вы хотите поддерживать в окончательном / перенесенном коде. Если вы настроите его как ES5
, TS скомпилирует синтаксические функции в ES5, поэтому любые стрелочные функции () => {}
в вашем коде будут преобразованы в function () {}
.
Все, что вы выберете для target
, влияет на значение по умолчанию lib
, которое, в свою очередь, сообщает TS, какие определения типов включить в ваш проект. Если у вас "target": "es5"
, значением по умолчанию lib
будет ["dom", "es5", "ScriptHost"]
. Предполагается, какие функциональные функции браузер будет поддерживать во время выполнения. Добавляя вещи в lib
, это просто для радости TS - вам все равно нужно самостоятельно импортировать полифил в проект.
Вкратце: сначала настройте target
, и если вам понадобится дополнительный полифилл в вашем проекте ИЛИ вы знаете, что ваш браузер (ы) будет поддерживать эту небольшую дополнительную функцию, lib
- вот как порадовать TS.
Пример: вам нужно поддерживать IE11, но вы также хотите использовать обещания. IE11 поддерживает ES5, но promises - это функция ES6. Вы импортируете полифил обещаний, но TS по-прежнему выдает ошибку. Теперь вам просто нужно сообщить TypeScript, что ваш код будет нацелен на ES5 и безопасно использовать обещания в базе кода:
"target": "es5",
"lib": ["dom", "es5", "ScriptHost", "es2015.promise"]