TypeScript. Начало работы, часть 1 из 7

08.02.2023

Теги: JavaScriptTypeScriptWeb-разработкаТеорияТипыДанных

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 файлы.

Строгий режим появился ECMAScript 5 (ES5). Он добавил новые возможности в язык и изменил некоторые из существующих. Чтобы устаревший код работал, как и раньше, по умолчанию подобные изменения не применяются. Поэтому нужно явно их активировать с помощью специальной директивы 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.

Дополнительно

Поиск: JavaScript • Web-разработка • Теория • Типы данных • TypeScript • tsconfig.json

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.