TypeScript. Начало работы, часть 1 из 7
08.02.2023
Теги: JavaScript • TypeScript • Web-разработка • Теория • ТипыДанных
TypeScript — типизированное надмножество JavaScript, предназначенное для выявления ошибок на этапе компиляции. Код на TypeScript компилируется в код JavaScript, который выполняется в любом браузере. Эта надстройка вокруг основного языка JavaScript дает разработчикам статическую типизацию и приведение типов.
$ npm install -g typescript
Опции компиляции
При компиляции файлов TypeScript в файлы JavaScript из командной строки с помощью компилятора tsc можно задать множество опций.
Опция -w или --watch автоматически перекомпилирует файлы typescript, если в них были внесены какие-либо изменения. Благодаря чему не надо при каждом изменении вручную вводить команду в консоль для перекомпиляции.
$ tsc --watch app.ts
С помощью опции -t или --target можно задать версию стандарта JavaScript, в которую будет компилироваться код TypeScript.
$ tsc --target es5 app.ts
По умолчанию в файлы JavaScript переносятся все комментариии, которыми снабжен код в файлах TypeScript. Удаление комментариев при компиляции осуществляется с помощью опции --removeComments.
$ tsc --removeComments app.ts
С помощью опции --outDir можно задать директорию для хранения скомпилированных файлов JavaScript.
$ tsc --outDir ./build/js app.ts
Если есть несколько файлов TypeScript, то с помощью опции --outFile их можно объединить в один файл JavaScript.
$ tsc --outFile output.js app.ts core.ts
С помощью опции -m или --module можно указать тип модульной системы, которую будет использовать скомпилированное приложение.
$ tsc --module commonjs app.ts
Опция --noEmit позволяет не создавать выходные javascript файлы, но посмотреть на ошибки, которые возникают при компиляции.
$ tsc --noEmit
Опция --init позволяет создать файл настройки tsconfig.json проекта TypeScript (см.ниже).
$ tsc --init
Чтобы посмотреть все доступные опции и справку по ним, можно воспользоваться опцией -h или --help.
$ tsc --help tsc: The TypeScript Compiler - Version 4.9.4 COMMON COMMANDS tsc Compiles the current project (tsconfig.json in the working directory.) tsc app.ts util.ts Ignoring tsconfig.json, compiles the specified files with default compiler options. tsc -b Build a composite project in the working directory. tsc --init Creates a tsconfig.json with the recommended settings in the working directory. tsc -p ./path/to/tsconfig.json Compiles the TypeScript project located at the specified path. tsc --help --all An expanded version of this information, showing all possible compiler options tsc --noEmit tsc --target esnext Compiles the current project, with additional settings. COMMAND LINE FLAGS --help, -h Print this message. --watch, -w Watch input files. --all Show all compiler options. --version, -v Print the compiler's version. --init Initializes a TypeScript project and creates a tsconfig.json file. --project, -p Compile the project given the path to its configuration file, or to a folder with a 'tsconfig.json'. --build, -b Build one or more projects and their dependencies, if out of date --showConfig Print the final configuration instead of building. COMMON COMPILER OPTIONS --pretty Enable color and formatting in TypeScript's output to make compiler errors easier to read. type: boolean default: true --target, -t Set the JavaScript language version for emitted JavaScript and include compatible library declarations. one of: es3, es5, es6/es2015, es2016, es2017, es2018, es2019, es2020, es2021, es2022, esnext default: es3 --module, -m Specify what module code is generated. one of: none, commonjs, amd, umd, system, es6/es2015, es2020, es2022, esnext, node16, nodenext default: undefined --lib Specify a set of bundled library declaration files that describe the target runtime environment. one or more: es5, es6/es2015, es7/es2016, es2017, es2018, es2019, es2020, es2021, es2022, esnext, dom, dom.iterable, webworker, webworker.importscripts, webworker.iterable, scripthost, es2015.core, es2015.collection, es2015.generator, es2015.iterable, es2015.promise, es2015.proxy, es2015.reflect, es2015.symbol, es2015.symbol.wellknown, es2016.array.include, es2017.object, es2017.sharedmemory, es2017.string, es2017.intl, es2017.typedarrays, es2018.asyncgenerator, es2018.asynciterable/esnext.asynciterable, es2018.intl, es2018.promise, es2018.regexp, es2019.array, es2019.object, es2019.string, es2019.symbol/esnext.symbol, es2019.intl, es2020.bigint/esnext.bigint, es2020.date, es2020.promise, es2020.sharedmemory, es2020.string, es2020.symbol.wellknown, es2020.intl, es2020.number, es2021.promise/esnext.promise, es2021.string, es2021.weakref/esnext.weakref, es2021.intl, es2022.array/esnext.array, es2022.error, es2022.intl, es2022.object, es2022.sharedmemory, es2022.string/esnext.string, esnext.intl default: undefined --allowJs Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. type: boolean default: false --checkJs Enable error reporting in type-checked JavaScript files. type: boolean default: false --jsx Specify what JSX code is generated. one of: preserve, react, react-native, react-jsx, react-jsxdev default: undefined --declaration, -d Generate .d.ts files from TypeScript and JavaScript files in your project. type: boolean default: `false`, unless `composite` is set --declarationMap Create sourcemaps for d.ts files. type: boolean default: false --emitDeclarationOnly Only output d.ts files and not JavaScript files. type: boolean default: false --sourceMap Create source map files for emitted JavaScript files. type: boolean default: false --outFile Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. --outDir Specify an output folder for all emitted files. --removeComments Disable emitting comments. type: boolean default: false --noEmit Disable emitting files from a compilation. type: boolean default: false --strict Enable all strict type-checking options. type: boolean default: false --types Specify type package names to be included without being referenced in a source file. --esModuleInterop Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. type: boolean default: false You can learn about all of the compiler options at https://aka.ms/tsc
Файл tsconfig.json
С помощью файла tsconfig.json можно настроить проект TypeScript — установить корневой каталог и имена файлов + задать значения параметров компиляции.
{ "compilerOptions": { "target": "es2015", // скомпилировать в javascript стандарта ES2015 "moduleResolution": "node16", // как разрешать модули при компиляции typescript "module": "es2015", // javascript код будет использовать модули ES2015 "outDir": "build", // директория для скомпилированных javascript файлов "strict": true, // включить все опции группы Strict Checks "sourceMap": true, // при компиляции создавать карту кода "removeComments": true, // удалить комментарии в javascript файлах "newLine": "lf", // новая строка в javascript файлах — как в Linux "esModuleInterop": true, // импортировать модули CommonJS как модули ES2015 "forceConsistentCasingInFileNames": true }, "files": [ "src/ts/core.ts", "src/ts/app.ts" ] }
Опция extends
Указывает путь к файлу из которого нужно унаследовать опции. По большей части, служит инструментом упорядочивания. Можно разделить опции по некой логике, чтобы они не смешивались. Допустим, нам нужно создать production и development версии настроек — так бы мог выглядеть файл tsconfig-dev.json.
{ "extends": "./tsconfig.json", "compilerOptions": { // переопределяем настройки, которые нужны только для dev режима "sourceMap": true, "watch": true } }
При использовании extends увидеть итоговую, объединённую версию настроек можно с помощью команды
$ tsc --showConfig
Опция files
Указывает список конкретных файлов для компиляции — подходит лишь для совсем маленьких проектов из нескольких файлов.
{ "compilerOptions": {}, "files": [ "src/ts/core.ts", "src/ts/app.ts" ] }
Опция include
Используется для поиска компилируемых файлов, если не указана опция files. Если include тоже не указана, то её значение будет неявно объявлено как ["**/*"]. Это означает, что поиск файлов будет осуществляться во всех директориях и поддиректориях. Такое поведение не оптимально, поэтому в целях производительности лучше всегда указывать конкретные пути. Можно прописывать как пути к конкретным файлам, так и шаблоны путей.
{ "compilerOptions": {}, "include": [ "src/**/*", "test/**/*" ] }
Если шаблоны не указывают конкретных расширений файлов, то поиск будет включать только .ts, .tsx и .d.ts. Чтобы включить в поиск файлы .js и .jsx — нужно указать allowJs:true внутри compilerOptions.
src, ./src, src/**/* равноценны, какой использовать — дело вкуса.
Технически, с помощью опций include и exclude, будет сформирован список файлов и помещен в files. Это можно увидеть, если выполнить команду tsc --showConfig.
Опция exclude
Позволяет исключить некоторые лишние пути или файлы, которые бфли добавлены в список с помощью опции include. По умолчанию, опция имеет значение путей пакетных менеджеров npm, bower и jspm, так как модули в них уже собраны. Помимо этого, игнорируется директория из опции outDir, если она указана.
Если добавить свои значения в эту опцию — важно не забыть восстановить умолчания. Так как пользовательские значения не объединяются со значениями по умолчанию. Другими словами, необходимо вручную указать корень модулей своего пакетного менеджера.
{ "compilerOptions": {}, "include": [ "src/**/*" ], "exclude": [ "node_modules", "src/**/*.spec.ts" ] }
exclude не может исключить файлы, указанные через files. И не может исключить файлы, если они импортируются в других файлах, которые не были исключены.
Секция compilerOptions
Опция target
Значение по умолчанию — es3. Изменение значения target изменяет значение по умолчанию для lib.
Версия стандарта ECMAScript, в которую будет скомпилирован TypeScript код — es3, es5, es6 (или es2015), es7 (или es2016), es2017, es2018, es2019, es2020, es2021, es2022, esnext.
Для frontend-приложений можно выбрать es6 — большинство браузеров его поддерживают. Чтобы обеспечить работу кода в старых браузерах — можно выбрать es5. Для backend-приложений подойдёт es6 для новых версий Node.js и значение es5 — для старых.
Опция module
Значение по умолчанию зависит от target.
Модульная система, которую будет использовать собранное приложение — none, commonjs, amd, system, umd, es6 (или es2015), es2020, es2022, esnext, node16, nodenext. Для backend-приложений подойдёт es6 или commonjs в зависимости от версий Node.js, которые нужно поддерживать. Для frontend-приложений под современные браузеры подходит es6, под старые браузеры — значение umd.
Значения node16 и nodenext предназначены для последних версий Node.js, где реализована поддержка ECMAScript модулей. Скомпилированный JavaScript использует CommonJS или ESM (ES module) — в зависимости от расширения файла и значения параметра type в ближайшем файле package.json.
Опция moduleResulution
Значение по умолчанию зависит от module.
Стратегия, которую будет использовать компилятор для импорта модулей, зависит от module. Значение node — использовать модули CommonJS, значение node16 или nodenext — использовать модули ECMAScript, classic — для обратной совместимости, не рекомендуется использовать.
module режим moduleResolution может переключиться на classic и в консоли начнут появляться сообщения об ошибках на строчках с импортами. Рекомендется всегда устанавливать значение этой опции в node или node16.
Опция lib
Значение по умолчанию зависит от target.
TypeScript включает в себя набор определений типов для встроенных API-интерфейсов JavaScript (например, Math), а также определения типов для вещей, которые можно найти в среде браузера (например, document). TypeScript также включает API для новых функций JavaScript, соответствующих указанному target — например, определение для Map доступно, если target:es6 или новее.
Причина для изменения значения lib — необычная среда выполнения скомпилированного кода. Например, приложение не предназначено для работы в браузере, поэтому не нужны DOM определения типов. Или, среда выполнения предоставляет определенные объекты API JavaScript (возможно, посредством полифиллов), но еще не поддерживает полный синтаксис данной версии ECMAScript.
- По умолчанию для
target:es5подключаютсяDOM,ES5,ScriptHost - По умолчанию для
target:es6подключаютсяDOM,ES6,DOM.Iterable,ScriptHost
При изменении значения lib умолчания сбрасываются — это значит, что нужно руками добавить то, что необходимо.
Опция outDir
Значение по умолчанию равно корневой директории проекта.
Конечная директория, куда будут помещаться скомпилированные javascript-файлы. Если не указывать значение этой опции, то все javascript-файлы будут повторять структуру typescript-файлов в корне проекта.
Если оставить опцию outDir пустой
├── module │ └── core.js │ └── core.ts ├── index.js └── index.ts
Если указать значение опции outDir
├── dist │ └── module │ | └── core.js │ └── index.js ├── module │ └── core.ts └── index.ts
Опция outFile
Значение по умолчанию — none.
Судя по описанию, данная опция позволяет объединить все файлы в один. Кажется, что сборщики больше не нужны — однако, опция не будет работать с модулями CommonJS или ES2015. Опция позволяет только объединить все глобальные (немодульные) файлы в один указанный выходной файл. Опция работает, только если значение module указано как None, System или AMD. Так что особого смысла в ее использовании нет.
Опция allowSyntheticDefaultImports
Значение по умолчанию зависит от module или esModuleInterop.
Опция позволяет предотвращать ошибки компиляции по причине несовместимости модулей ES2015 и CommonJS. Чаще всего проблема возникает в случае, когда разработка ведется с применением одних модулей, а подключаемые библиотеки используют другие. В ES2015 синтаксисе есть возможность экспорта и импорта по умолчанию. С другой стороны, подключаемый модуль CommonJS может не иметь экспорта по умолчанию. При импорте по умолчанию такого модуля — возникает ошибка.
Для удобства разработчиков транспиляторы, такие как Babel, автоматически создают экспорт по умолчанию, если модуль его не содержит. Опция приводит поведение TypeScript в соответствие с Babel — так что при компиляции не будет ошибки «module has no default export». Опция включена по умолчанию, если включена опция esModuleInterop. При этом, опция никак не влияет на результирующий javascript код, но позволяет писать код следующим образом.
// вместо такого импорта import * as React from 'react'; // можно писать такой import React from 'react';
Опция esModuleInterop
Значение по умолчанию — false.
За счёт добавления болерплейта в выходной код, позволяет импортировать модули CommonJS как как модули ES2015. Опция по зависимости активирует allowSyntheticDefaultImports. Вместе они помогают избавиться от зоопарка разных импортов и писать их единообразно по всему проекту. Рекомендуется всегда выставлять опцию в значение true.
Опция alwaysStrict
Значение по умолчанию — false. Если включена опция strict, тогда true.
Компилятор будет парсить код в strict mode и добавлять use strict в выходные javascript файлы.
use strict.
Опция downlevelIteration
Значение по умолчанию — false.
Спецификация ES2015 добавила новый синтаксис для итерирования: цикл for/of, расширение массива [a, ...b], расширение аргумента fn(...args) и Symbol.iterator. Если код проекта преобразовывается в ES5, то конструкция с циклом for/of будет преобразована в обычный цикл for.
Однако, некоторые символы, такие как emoji кодируются с помощью двух символов. Т.е. такое преобразование в некоторых местах будет работать не так, как ожидается. Значение true генерирует более многословный и более правильный, но менее производительный код.
Опция forceConsistentCasingInFileNames
Значение по умолчанию — false.
Включает режим чувствительности к регистру (case-sensitive) для импорта файлов. Таким образом, даже в case-insensitive файловых системах при попытке сделать импорт FileManager.ts, если файл в действительности файл называется fileManager.ts, приведёт к ошибке.
Опция declaration
Значение по умолчанию — false.
С помощью включения данного флага, помимо javascript файлов, будут создаваться файлы-аннотации, известные как d.ts-файлы или тайпинги. Благодаря тайпингам становится возможным определение типов для уже скомпилированных javascript файлов. Другими словами, код попадает в js-файлы, а типы — в d.ts-файлы. Это полезно в случае публикации пакета в npm. Такой библиотекой смогут пользоваться разработчики, которые пишут как на чистом JavaScript, так и на TypeScript.
Опция declarationDir
Значение по умолчанию — none, связано с опцией declaration.
По умолчанию тайпинги генерируются рядом с javascript-файлами. Используя данную опцию можно перенаправить все d.ts-файлы в отдельную директорию.
Опция allowJs
Значение по умолчанию — false, зависит от checkJs.
Разрешить компилятору обрабатывать не только typescript-файлы, но и javascript-файлы. Опция можно использовать для постепенного перехода проекта от JavaScript к TypeScript, позволяя файлам .ts и .tsx жить вместе с файлами .js и .jsx. Старые jvascript-файлы можно постепенно заменять новыми typescript-файлами, просто меняя расширение и добавляя типизацию.
Опция checkJs
Значение по умолчанию — false. При включении checkJs — автоматически включается allowJs.
TypeScript будет проверять ошибки не только в typescript-файлах, но и в javascript-файлах. Помимо встроенных тайпингов для языковых конструкций JavaScript, компилятор так же умеет использовать jsDoc для анализа файлов.
Опция resolveJsonModule
Значение по умолчанию — false.
Опция позволяет включить возможность импортировать json файлы. Ничего дополнительно устанавливать не требуется.
// необходимо указывать расширение .json import config from './config.json';
Опция jsx
Значение по умолчанию — none.
Если проект использует React, необходимо включить поддержку JSX:
- значение
preserveсохранит JSX-код для дальнейшего преобразования в javascript, выходной файл будет иметь расширение.jsx - значение
reactпреобразует JSX-код в вызовыReact.createElement, не требует дальнейшего преобразования, выходной файл будет.js - значение
react-nativeэквивалентноpreserveв том смысле, что сохраняется JSX-код, но выходной файл будет иметь расширение.js.
Начиная с TypeScript 4.1 допускаются значения react-jsx и react-jsxdev — для поддержки React 17, где в коде можно опускать импорт React.
Дополнительно
- Раскладываем tsconfig.json по полочкам, часть 1
- Раскладываем tsconfig.json по полочкам, часть 2
- Руководство по TypeScript
- Intro to the TSConfig Reference
- Centralized Recommendations for TSConfig bases
Поиск: JavaScript • Web-разработка • Теория • Типы данных • TypeScript • tsconfig.json