Статическая типизация¶
Инструменты для статической типизации, такие как Flow или TypeScript, позволяют отлавливать большую часть ошибок ещё до исполнения кода. Кроме того, они существенно улучшают процессы разработки, добавляя автодополнение и другие возможности. Для приложений с большой кодовой базой мы рекомендуем использовать Flow или TypeScript вместо PropTypes
.
Flow¶
Flow — это библиотека для статической типизации JavaScript, разработанная в Facebook и часто применяемая в связке с React. Flow расширяет возможности JavaScript, добавляя аннотации типов для переменных, функций и React-компонентов. Ознакомиться с основами Flow можно на странице официальной документации.
Чтобы начать пользоваться возможностями Flow необходимо:
- добавить Flow в ваш проект как зависимость.
- убедиться, что аннотации Flow удаляются из кода при его компиляции.
- добавить несколько аннотаций типов и запустить Flow для их проверки;
Рассмотрим подробнее каждый из этих шагов.
Добавление Flow в проект¶
Убедитесь, что вы находитесь в директории проекта, после чего запустите одну из следующих команд:
Если вы используете Yarn:
1 |
|
Если вы используете npm:
1 |
|
Эти команды добавят последнюю версию Flow в ваш проект.
Далее нужно добавить flow
в секцию "scripts"
файла package.json
:
1 2 3 4 5 6 7 8 |
|
Теперь можно запустить скрипт, прописав в терминале:
1 |
|
Или npm
:
1 |
|
Эти команды создадут файл с исходной конфигурацией Flow, который обязательно нужно закоммитить.
Удаление аннотаций Flow из скомпилированного кода¶
Flow дополняет JavaScript собственным синтаксисом для указания типов, который не поддерживается браузерами. Для того, чтобы код работал, нужно убедиться в том, что аннотации Flow корректно удаляются из скомпилированного JavaScript.
Для этого есть несколько способов — выбирайте в зависимости от того, какими инструментами для сборки проекта вы пользуетесь.
Create React App¶
Если для изначальной конфигурации проекта вы выбрали Create React App, вам ничего не нужно делать! Проект уже настроен должным образом и аннотации Flow должны удаляться при сборке проекта.
Babel¶
Примечание:
Дальнейшие инструкции рассчитаны на тех, кто не использует Create React App, т.к. там уже есть все необходимые настройки для работы с Flow.
Если для своего проекта вы самостоятельно настраивали Babel, нужно установить специальный пресет для работы с Flow:
1 |
|
Или npm
:
1 |
|
Затем добавьте установленный пресет flow
в свою конфигурацию Babel. Например так, если вы используете конфигурационный файл .babelrc
:
1 2 3 4 5 6 |
|
Этот пресет позволит использовать Flow в вашем коде.
Примечание:
Для работы с Flow не требуется отдельно устанавливать пресет
react
— Flow уже понимает JSX синтаксис. Тем не менее, часто используют оба пресета одновременно.
Другие инструменты сборки¶
Для удаления аннотаций Flow существует отдельная библиотека: flow-remove-types. Она может пригодиться, если вы пользуетесь другими инструментами для сборки проекта.
Запуск Flow¶
Если всё было сделано правильно, можно попробовать запустить процесс Flow:
1 |
|
Или npm
:
1 |
|
Вы должны увидеть примерно такое сообщение в терминале:
1 2 |
|
Добавление аннотаций типов¶
По умолчанию Flow проверяет только файлы, содержащие специальную аннотацию (обычно её указывают в самом начале файла):
1 |
|
Попробуйте добавить эту аннотацию в некоторые файлы вашего проекта, а затем запустить скрипт yarn flow
или npm run flow
и посмотреть, найдёт ли Flow какие-нибудь ошибки.
Кроме того, есть возможность заставить Flow проверять вообще все файлы. Если вы переводите на Flow проект, в котором уже есть наработки кода, может возникнуть множество конфликтов, а вот для старта с нуля такая опция может стать неплохим выбором.
Всё должно работать! Советуем изучить Flow подробнее, ознакомившись со следующими ресурсами:
- Flow Documentation: Type Annotations
- Flow Documentation: Editors
- Flow Documentation: React
- Linting in Flow
TypeScript¶
TypeScript — это язык программирования, разработанный в Microsoft. TypeScript является надмножеством JavaScript, имеет статическую систему типов и собственный компилятор. Статическая типизация позволяет отлавливать ошибки и баги во время компиляции, ещё до запуска приложения. Подробнее узнать о совместном использовании TypeScript и React можно здесь.
Чтобы использовать TypeScript, нужно:
- добавить TypeScript в проект как зависимость.
- настроить компилятор.
- использовать правильные расширения файлов.
- установить файлы объявлений для используемых библиотек;
Остановимся подробнее на каждом из этих моментов.
Использование TypeScript вместе с Create React App¶
Create React App поддерживает TypeScript по умолчанию.
Чтобы создать новый проект с поддержкой TypeScript, используйте следующую команду:
1 |
|
Можно добавить поддержку TypeScript в уже существующий проект, как показано здесь.
Примечание:
Дальше описывается ручная настройка TypeScript. Если вы используете Create React App, можете пропустить этот раздел.
Добавление TypeScript в проект¶
Всё начинается с одной единственной команды в терминале:
1 |
|
Или npm
:
1 |
|
Ура! Вы установили последнюю версию TypeScript. Теперь в вашем распоряжении новая команда — tsc
. Но прежде, чем праздновать, давайте добавим соответствующий скрипт в файл package.json
:
1 2 3 4 5 6 7 8 |
|
Настройка компилятора TypeScript¶
Сам по себе компилятор бесполезен, пока мы не скажем, что именно ему нужно делать. Для этого есть специальный конфигурационный файл tsconfig.json
. Создадим этот файл:
1 |
|
Или npm
:
1 |
|
Сгенерированный файл tsconfig.json
уже содержит несколько параметров, которые используются компилятором по умолчанию. Кроме того, можно указать множество опциональных параметров. Более детальная информация по каждому параметру находится здесь
Из всех параметров больше всего сейчас нас интересуют rootDir
и outDir
. Очевидно, что компилятор берёт исходный TypeScript код, и компилирует его в JavaScript. И нам нужно, чтобы не возникло путаницы между исходными файлами и сгенерированным кодом.
Эту проблему можно решить в два шага:
- Во-первых, изменим структуру проекта. Все файлы с исходниками переместим в директорию
src
.
1 2 3 4 |
|
- Затем, укажем компилятору откуда ему брать исходные файлы и куда сохранять скомпилированный код.
1 2 3 4 5 6 7 8 9 10 |
|
Отлично! Теперь, если мы запустим скрипт сборки проекта, компилятор сохранит готовый JavaScript в директорию build
. В TypeScript React Starter уже есть готовый tsconfig.json
с неплохим набором параметров для дальнейшей тонкой настройки под себя.
Как правило, скомпилированный JavaScript-бандл не следует хранить в системе контроля версий, так что не забудьте добавить папку build
в файл .gitignore
.
Расширения файлов¶
В React мы почти всегда используем .js
в качестве расширений файлов компонентов. В TypeScript лучше разделять файлы на два типа:
.tsx
для файлов, содержащих JSX
разметку, и .ts
для всего остального.
Запуск TypeScript¶
Если всё было сделано правильно, можно попробовать скомпилировать TypeScript:
1 |
|
Или npm
:
1 |
|
Если эта команда не вывела ничего в терминале, то процесс компиляции прошёл успешно.
Определения типов¶
Для анализа ошибок и выдачи всплывающих подсказок компилятор TypeScript использует файлы объявлений. Они содержат в себе всю информацию о типах, которые используются в конкретной библиотеке. В свою очередь это позволяет нам использовать JavaScript библиотеки в проекте совместно с TypeScript.
Существует два основных способа получения файлов объявлений:
Bundled — Библиотека устанавливается вместе с собственным файлом объявлений. Это прекрасный вариант для нас, так как всё, что нам нужно — установить нужный пакет. Чтобы проверить, есть ли у библиотеки файл объявлений, поищите index.d.ts
в её исходных файлах. В некоторых библиотеках наличие и расположение этого файла указываются в package.json
в секциях typings
или types
.
DefinitelyTyped — это внушительный репозиторий файлов объявлений. Например, React устанавливается без собственного файла объявления — вместо этого мы устанавливаем его отдельно:
1 2 3 4 5 |
|
Локальные объявления Иногда пакет, который вы хотите использовать, не имеет ни собственного файла объявлений, ни соответствующего файла в репозитории DefinitelyTyped. В этом случае, мы можем объявить собственный локальный файл объявлений. Для этого надо создать файл declarations.d.ts
в корне директории, где лежат исходники вашего проекта. Файл объявлений может выглядеть примерно так:
1 2 3 4 |
|
Вот и всё, вы готовы писать код на TypeScript! Чтобы познакомиться с ним поближе, рекомендуем посетить эти ресурсы:
- TypeScript Documentation: Basic Types
- TypeScript Documentation: Migrating from Javascript
- TypeScript Documentation: React and Webpack
Reason¶
Reason — это не новый язык, а новый синтаксис и набор инструментов для проверенного временем языка OCaml. Reason предоставляет синтаксис, ориентированный на JavaScript программистов, и использует уже известный всем способ распространения через NPM/Yarn.
Reason был разработан в Facebook и используется в некоторых продуктах этой компании — например, в Messenger. Reason всё ещё считается довольно экспериментальным инструментом, но уже имеет библиотеку привязок для React, поддерживаемую Facebook, а также отзывчивое сообщество
Kotlin¶
Kotlin – это язык со статической типизацией, разработанный в JetBrains. Он нацелен на платформы работающие на основе JVM, Android, LLVM и JavaScript.
JetBrains разрабатывает и поддерживает несколько библиотек специально для сообщества React: React bindings совместно с Create React Kotlin App. Последняя позволит вам начать использовать Kotlin вместе с React в одном проекте без необходимости ручной конфигурации.
Другие языки¶
Помните: есть и другие языки со статической типизацией, которые могут компилироваться в JavaScript, а значит — совместимы с React. Например, F#/Fable вместе с elmish-react. Для подробной информации переходите на соответствующие сайты и не стесняйтесь предлагать больше React-совместимых статически типизированных языков в этот раздел!