Что на самом деле делает опция библиотеки TypeScript?

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


person Morten H Pedersen    schedule 22.06.2018    source источник


Ответы (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 и заполнить некоторые из средств выполнения, что в целом может быть выполнено для некоторых вещей. (например: обещания).

person Titian Cernicova-Dragomir    schedule 22.06.2018
comment
Но библиотеки также влияют на то, какие функции доступны на стороне Typescript? (Как Promise ()) Почему TS всегда не только полигоны? Это означает, что объекты, не относящиеся к TS, доступны в целевой среде? - person Morten H Pedersen; 23.06.2018
comment
Что ж, Promise - это тип, поэтому то, что я сказал, применимо. TypeScript пытается минимально присутствовать в сгенерированном коде. Вам нужны полифиллы, которые нужно добавить сами - person Titian Cernicova-Dragomir; 23.06.2018
comment
Спасибо. Не удалось найти его действительно объясненного нигде на typescriptlang.org - person Morten H Pedersen; 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"]
person cleison    schedule 13.08.2019
comment
Это, безусловно, самый ясный и краткий ответ, который я читал по этой теме. Спасибо! - person Ersin Akinci; 27.03.2020