Академический Документы
Профессиональный Документы
Культура Документы
Часть 1 / Хабр
Я большой фанат TypeScript. Каждый свой новый проект я предпочитаю писать на нём, а
не на чистом JavaScript. В данной статье я не буду рассматривать причины выбора
TypeScript или о его преимуществах и недостатках. Я хочу, чтобы данный пост стал
своего рода шпаргалкой для тех, кто хочет понять, как настраивать tsconfig ,
разложить по полочкам его многочисленные флаги и, возможно, узнать некоторые
полезные трюки.
Итак, в данной статье я хочу предоставить переработанную и упорядоченную выжимку
документации, которая, я уверен, будет полезна тем, кто только начинает свой путь в
мире TypeScript или тем, кто до этого момента не нашёл времени и сил, чтобы
разобраться в деталях и теперь хочет закрыть этот пробел.
Если открыть официальный референс tsconfig , то там будет полный список всех
настроек, разделённых по группам. Однако, это не даёт понимания, с чего начать и что
из данного обширного списка опций обязательно, а на что можно не обращать внимания
https://habr.com/ru/articles/542234/ 1/21
9/4/23, 11:25 PM TypeScript: Раскладываем tsconfig по полочкам. Часть 1 / Хабр
(по крайней мере до поры до времени). Плюс, иногда опции сгруппированы по некому
техническому, а не логическому смыслу. Например, некоторые флаги проверок можно
найти в группе Strict Checks , некоторые в Linter Checks , а другие в Advanced .
Это не всегда удобно для понимания.
Все опции, как и саму статью, я разделил на две группы – базовые и "проверки". В
первой части статьи разговор пойдёт про базовые настройки, а во второй уже про
различные проверки, т. е. про тюнинг строгости компилятора.
Структура tsconfig
Рассмотрим структуру и некоторые особенности конфига.
tsconfig.jsonсостоит из двух частей. Какие-то опции необходимо указывать в
root , а какие-то в compilerOptions
{
// extends позволяет обогатить опции другими опциями из указанного файла
// файлом tsconfig-checks.json займёмся во второй части статьи
"extends": "./tsconfig-checks.json",
// в корне конфига находятся project-specific опции
"compilerOptions": {
// здесь все настройки, связанные с компилятором
}
}
https://habr.com/ru/articles/542234/ 2/21
9/4/23, 11:25 PM TypeScript: Раскладываем tsconfig по полочкам. Часть 1 / Хабр
Секция root
extends
{
"compilerOptions": {
// блок базовых настроек
{
"extends": "./tsconfig.json",
"compilerOptions": {
// переопределяем настройки, которые нужны только для dev режима
"sourceMap": true,
"watch": true
}
}
files
{
"compilerOptions": {},
"files": [
"core.ts",
"app.ts"
]
}
Данная опция подходит лишь для совсем маленьких проектов из нескольких файлов.
include
{
"compilerOptions": {},
"include": [
"src/**/*",
"tests/**/*"
]
}
https://habr.com/ru/articles/542234/ 4/21
9/4/23, 11:25 PM TypeScript: Раскладываем tsconfig по полочкам. Часть 1 / Хабр
{
"compilerOptions": {},
"exclude": [
"node_modules",
"./src/**/*.spec.ts"
]
}
Секция compilerOptions
target
lib
array.find и прочих вещей, которые есть в стандарте. Но если target стоит ES5 ,
то использовать метод массива find нельзя, так как его не существует в этой версии
JavaScript. Можно подключить полифилы. Однако, для того, чтобы TypeScript понял, что
теперь данную функциональность можно использовать, необходимо подключить
необходимые тайпинги в секции lib . При этом, можно подключить как весь стандарт
ES2015 , так и его часть ES2015.Core (только методы find , findIndex и т. д.).
{
"compilerOptions": {
"target": "ES5",
"lib": [
"DOM",
"ES2015.Core"
]
}
}
outDir
Type: string, default: равняется корневой директории.
Конечная папка, куда будут помещаться собранные артефакты. К ним относятся: .js ,
.d.ts , и .js.map файлы. Если не указывать значение для данной опции, то все
вышеуказанные файлы будут повторять структуру исходных файлов в корне вашего
проекта. В таком случае будет сложно удалять предыдущие билды и описывать
.gitignore файлы. Да и кодовая база будет похожа на свалку. Советую складывать
все артефакты в одну папку, которую легко удалить или заигнорировать системой
контроля версий.
Если оставить опцию outDir пустой:
https://habr.com/ru/articles/542234/ 7/21
9/4/23, 11:25 PM TypeScript: Раскладываем tsconfig по полочкам. Часть 1 / Хабр
├── module
│ └── core.js
│ └── core.ts
├── index.js
└── index.ts
├── dist
│ └── module
│ | └── core.js
│ └── index.js
├── module
│ └── core.ts
└── index.ts
outFile
https://habr.com/ru/articles/542234/ 8/21
9/4/23, 11:25 PM TypeScript: Раскладываем tsconfig по полочкам. Часть 1 / Хабр
https://habr.com/ru/articles/542234/ 9/21
9/4/23, 11:25 PM TypeScript: Раскладываем tsconfig по полочкам. Часть 1 / Хабр
// код es6
const str = 'Hello!';
for (const s of str) {
console.log(s);
}
Однако, некоторые символы, такие как emoji кодируются с помощью двух символов. Т.
е. такое преобразование в некоторых местах будет работать не так, как ожидается.
Включенный флаг downlevelIteration генерирует более многословный и более
"правильный", но менее производительный код. Код получается действительно очень
большим, поэтому не буду занимать место на экране. Если интересно посмотреть
пример, то перейдите в playground и выберете в настройках target -> es5 ,
downlevelIteration -> true .
forceConsistentCasingInFileNames
Type: boolean, default: false.
Включает режим чувствительности к регистру (case-sensitive) для импорта файлов.
Таким образом, даже в case-insensitive файловых системах при попытке сделать импорт
import FileManager from './FileManager.ts' , если файл в действительности
называется fileManager.ts , приведёт к ошибке. Перестраховаться лишний раз не
повредит. TypeScript - это про строгость.
https://habr.com/ru/articles/542234/ 10/21
9/4/23, 11:25 PM TypeScript: Раскладываем tsconfig по полочкам. Часть 1 / Хабр
declaration
флаг, а наводить порядок в коде в момент его типизации. Однако, если в вашем проекте
хорошее покрытие кода jsDoc, стоит попробовать.
С версии 4.1 при включении checkJs , флаг allowJs включается автоматически.
experimentalDecorators и emitDecoratorMetadata
jsx
Type: string, default: none.
Если проект использует React, необходимо включить поддержку jsx . В подавляющем
большинстве случаев будет достаточно опций react или react-native . Так же есть
возможность оставить jsx-код нетронутым с помощью опции preserve или
использовать кастомные преобразователи react-jsx и react-jsxdev .
https://habr.com/ru/articles/542234/ 12/21