{"componentChunkName":"component---src-templates-docs-js","path":"/docs/static-type-checking.html","result":{"data":{"markdownRemark":{"html":"<p>Инструменты для статической типизации, такие как <a href=\"https://flow.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Flow</a> или <a href=\"https://www.typescriptlang.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TypeScript</a>, позволяют отлавливать большую часть ошибок ещё до исполнения кода. Кроме того, они существенно улучшают процессы разработки, добавляя автодополнение и другие возможности. Для приложений с большой кодовой базой мы рекомендуем использовать Flow или TypeScript вместо <code class=\"gatsby-code-text\">PropTypes</code>.</p>\n<h2 id=\"flow\"><a href=\"#flow\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Flow </h2>\n<p><a href=\"https://flow.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Flow</a> — это библиотека для статической типизации JavaScript, разработанная в Facebook и часто применяемая в связке с React. Flow расширяет возможности JavaScript, добавляя аннотации типов для переменных, функций и React-компонентов. Ознакомиться с основами Flow можно на странице <a href=\"https://flow.org/en/docs/getting-started/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">официальной документации</a>.</p>\n<p>Чтобы начать пользоваться возможностями Flow необходимо:</p>\n<ul>\n<li>добавить Flow в ваш проект как зависимость.</li>\n<li>убедиться, что аннотации Flow удаляются из кода при его компиляции.</li>\n<li>добавить несколько аннотаций типов и запустить Flow для их проверки;</li>\n</ul>\n<p>Рассмотрим подробнее каждый из этих шагов.</p>\n<h3 id=\"adding-flow-to-a-project\"><a href=\"#adding-flow-to-a-project\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Добавление Flow в проект </h3>\n<p>Убедитесь, что вы находитесь в директории проекта, после чего запустите одну из следующих команд:</p>\n<p>Если вы используете <a href=\"https://yarnpkg.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Yarn</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> <span class=\"token function\">add</span> --dev flow-bin</code></pre></div>\n<p>Если вы используете <a href=\"https://www.npmjs.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">npm</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev flow-bin</code></pre></div>\n<p>Эти команды добавят последнюю версию Flow в ваш проект.</p>\n<p>Далее нужно добавить <code class=\"gatsby-code-text\">flow</code> в секцию <code class=\"gatsby-code-text\">&quot;scripts&quot;</code> файла <code class=\"gatsby-code-text\">package.json</code>:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token string\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token string\">\"flow\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"flow\"</span><span class=\"token punctuation\">,</span></span>    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Теперь можно запустить скрипт, прописав в терминале:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> run flow init</code></pre></div>\n<p>Или <code class=\"gatsby-code-text\">npm</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">npm</span> run flow init</code></pre></div>\n<p>Эти команды создадут файл с исходной конфигурацией Flow, который обязательно нужно закоммитить. </p>\n<h3 id=\"stripping-flow-syntax-from-the-compiled-code\"><a href=\"#stripping-flow-syntax-from-the-compiled-code\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Удаление аннотаций Flow из скомпилированного кода </h3>\n<p>Flow дополняет JavaScript собственным синтаксисом для указания типов, который не поддерживается браузерами. Для того, чтобы код работал, нужно убедиться в том, что аннотации Flow корректно удаляются из скомпилированного JavaScript.</p>\n<p>Для этого есть несколько способов — выбирайте в зависимости от того, какими инструментами для сборки проекта вы пользуетесь.</p>\n<h4 id=\"create-react-app\"><a href=\"#create-react-app\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Create React App </h4>\n<p>Если для изначальной конфигурации проекта вы выбрали <a href=\"https://github.com/facebookincubator/create-react-app\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Create React App</a>, вам ничего не нужно делать! Проект уже настроен должным образом и аннотации Flow должны удаляться при сборке проекта.</p>\n<h4 id=\"babel\"><a href=\"#babel\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Babel </h4>\n<blockquote>\n<p>Примечание:</p>\n<p>Дальнейшие инструкции рассчитаны на тех, кто <em>не использует</em> Create React App, т. к. там уже есть все необходимые настройки для работы с Flow.</p>\n</blockquote>\n<p>Если для своего проекта вы самостоятельно настраивали Babel, нужно установить специальный пресет для работы с Flow:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> <span class=\"token function\">add</span> --dev @babel/preset-flow</code></pre></div>\n<p>Или <code class=\"gatsby-code-text\">npm</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev @babel/preset-flow</code></pre></div>\n<p>Затем добавьте установленный пресет <code class=\"gatsby-code-text\">flow</code> в свою <a href=\"https://babeljs.io/docs/usage/babelrc/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">конфигурацию Babel</a>. Например так, если вы используете конфигурационный файл <code class=\"gatsby-code-text\">.babelrc</code>:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token punctuation\">{</span>\n  <span class=\"token string\">\"presets\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token string\">\"@babel/preset-flow\"</span><span class=\"token punctuation\">,</span></span>    <span class=\"token string\">\"react\"</span>\n  <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Этот пресет позволит использовать Flow в вашем коде.</p>\n<blockquote>\n<p>Примечание:</p>\n<p>Для работы с Flow не требуется отдельно устанавливать пресет <code class=\"gatsby-code-text\">react</code> — Flow уже понимает JSX-синтаксис. Тем не менее, часто используют оба пресета одновременно.</p>\n</blockquote>\n<h4 id=\"other-build-setups\"><a href=\"#other-build-setups\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Другие инструменты сборки </h4>\n<p>Для удаления аннотаций Flow существует отдельная библиотека: <a href=\"https://github.com/flowtype/flow-remove-types\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">flow-remove-types</a>. Она может пригодиться, если вы пользуетесь другими инструментами для сборки проекта.</p>\n<h3 id=\"running-flow\"><a href=\"#running-flow\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Запуск Flow </h3>\n<p>Если всё было сделано правильно, можно попробовать запустить процесс Flow:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> flow</code></pre></div>\n<p>Или <code class=\"gatsby-code-text\">npm</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">npm</span> run flow</code></pre></div>\n<p>Вы должны увидеть примерно такое сообщение в терминале:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">No errors!\n✨  Done in 0.17s.</code></pre></div>\n<h3 id=\"adding-flow-type-annotations\"><a href=\"#adding-flow-type-annotations\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Добавление аннотаций типов </h3>\n<p>По умолчанию Flow проверяет только файлы, содержащие специальную аннотацию (обычно её указывают в самом начале файла):</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token comment\">// @flow</span></code></pre></div>\n<p>Попробуйте добавить эту аннотацию в некоторые файлы вашего проекта, а затем запустить скрипт <code class=\"gatsby-code-text\">yarn flow</code> или <code class=\"gatsby-code-text\">npm run flow</code> и посмотреть, найдёт ли Flow какие-нибудь ошибки.</p>\n<p>Кроме того, есть <a href=\"https://flow.org/en/docs/config/options/#toc-all-boolean\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">возможность</a> заставить Flow проверять вообще <em>все</em> файлы. Если вы переводите на Flow проект, в котором уже есть наработки кода, может возникнуть множество конфликтов, а вот для старта с нуля такая опция может стать неплохим выбором.</p>\n<p>Всё должно работать! Советуем изучить Flow подробнее, ознакомившись со следующими ресурсами:</p>\n<ul>\n<li><a href=\"https://flow.org/en/docs/types/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Flow Documentation: Type Annotations</a></li>\n<li><a href=\"https://flow.org/en/docs/editors/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Flow Documentation: Editors</a></li>\n<li><a href=\"https://flow.org/en/docs/react/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Flow Documentation: React</a></li>\n<li><a href=\"https://medium.com/flow-type/linting-in-flow-7709d7a7e969\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Linting in Flow</a></li>\n</ul>\n<h2 id=\"typescript\"><a href=\"#typescript\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TypeScript </h2>\n<p><a href=\"https://www.typescriptlang.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TypeScript</a> — это язык программирования, разработанный в Microsoft. TypeScript является надмножеством JavaScript, имеет статическую систему типов и собственный компилятор. Статическая типизация позволяет отлавливать ошибки и баги во время компиляции, ещё до запуска приложения. Подробнее узнать о совместном использовании TypeScript и React можно <a href=\"https://github.com/Microsoft/TypeScript-React-Starter#typescript-react-starter\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">здесь</a>.</p>\n<p>Чтобы использовать TypeScript, нужно:</p>\n<ul>\n<li>добавить TypeScript в проект как зависимость.</li>\n<li>настроить компилятор.</li>\n<li>использовать правильные расширения файлов.</li>\n<li>установить файлы объявлений для используемых библиотек;</li>\n</ul>\n<p>Остановимся подробнее на каждом из этих моментов.</p>\n<h3 id=\"using-typescript-with-create-react-app\"><a href=\"#using-typescript-with-create-react-app\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Использование TypeScript вместе с Create React App </h3>\n<p>Create React App поддерживает TypeScript по умолчанию.</p>\n<p>Чтобы создать <strong>новый проект</strong> с поддержкой TypeScript, используйте следующую команду:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\">npx create-react-app my-app --template typescript</code></pre></div>\n<p>Можно добавить поддержку TypeScript в <strong>уже существующий проект</strong>, <a href=\"https://facebook.github.io/create-react-app/docs/adding-typescript\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">как показано здесь</a>.</p>\n<blockquote>\n<p>Примечание:</p>\n<p>Дальше описывается ручная настройка TypeScript. Если вы используете Create React App, можете <strong>пропустить этот раздел</strong>. </p>\n</blockquote>\n<h3 id=\"adding-typescript-to-a-project\"><a href=\"#adding-typescript-to-a-project\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Добавление TypeScript в проект </h3>\n<p>Всё начинается с одной единственной команды в терминале:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> <span class=\"token function\">add</span> --dev typescript</code></pre></div>\n<p>Или <code class=\"gatsby-code-text\">npm</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> --save-dev typescript</code></pre></div>\n<p>Ура! Вы установили последнюю версию TypeScript. Теперь в вашем распоряжении новая команда — <code class=\"gatsby-code-text\">tsc</code>. Но прежде, чем праздновать, давайте добавим соответствующий скрипт в файл <code class=\"gatsby-code-text\">package.json</code>:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n  <span class=\"token string\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token string\">\"build\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"tsc\"</span><span class=\"token punctuation\">,</span></span>    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"configuring-the-typescript-compiler\"><a href=\"#configuring-the-typescript-compiler\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Настройка компилятора TypeScript </h3>\n<p>Сам по себе компилятор бесполезен, пока мы не скажем, что именно ему нужно делать. Для этого есть специальный конфигурационный файл <code class=\"gatsby-code-text\">tsconfig.json</code>. Создадим этот файл:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> run tsc --init</code></pre></div>\n<p>Или <code class=\"gatsby-code-text\">npm</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\">npx tsc --init</code></pre></div>\n<p>Сгенерированный файл <code class=\"gatsby-code-text\">tsconfig.json</code> уже содержит несколько параметров, которые используются компилятором по умолчанию. Кроме того, можно указать множество опциональных параметров. Более детальная информация по каждому параметру находится <a href=\"https://www.typescriptlang.org/docs/handbook/tsconfig-json.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">здесь</a></p>\n<p>Из всех параметров больше всего сейчас нас интересуют <code class=\"gatsby-code-text\">rootDir</code> и <code class=\"gatsby-code-text\">outDir</code>. Очевидно, что компилятор берёт исходный TypeScript код, и компилирует его в JavaScript. И нам нужно, чтобы не возникло путаницы между исходными файлами и сгенерированным кодом.</p>\n<p>Эту проблему можно решить в два шага:</p>\n<ul>\n<li>Во-первых, изменим структуру проекта. Все файлы с исходниками переместим в директорию <code class=\"gatsby-code-text\">src</code>.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">├── package.json\n├── src\n│   └── index.ts\n└── tsconfig.json</code></pre></div>\n<ul>\n<li>Затем, укажем компилятору откуда ему брать исходные файлы и куда сохранять скомпилированный код.</li>\n</ul>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token comment\">// tsconfig.json</span>\n\n<span class=\"token punctuation\">{</span>\n  <span class=\"token string\">\"compilerOptions\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token string\">\"rootDir\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"src\"</span><span class=\"token punctuation\">,</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token string\">\"outDir\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"build\"</span></span>    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Отлично! Теперь, если мы запустим скрипт сборки проекта, компилятор сохранит готовый JavaScript в директорию <code class=\"gatsby-code-text\">build</code>. В <a href=\"https://github.com/Microsoft/TypeScript-React-Starter/blob/master/tsconfig.json\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TypeScript React Starter</a> уже есть готовый <code class=\"gatsby-code-text\">tsconfig.json</code> с неплохим набором параметров для дальнейшей тонкой настройки под себя.</p>\n<p>Как правило, скомпилированный JavaScript-бандл не следует хранить в системе контроля версий, так что не забудьте добавить папку <code class=\"gatsby-code-text\">build</code> в файл <code class=\"gatsby-code-text\">.gitignore</code>.</p>\n<h3 id=\"file-extensions\"><a href=\"#file-extensions\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Расширения файлов </h3>\n<p>В React мы почти всегда используем <code class=\"gatsby-code-text\">.js</code> в качестве расширений файлов компонентов. В TypeScript лучше разделять файлы на два типа: </p>\n<p><code class=\"gatsby-code-text\">.tsx</code> для файлов, содержащих разметку <code class=\"gatsby-code-text\">JSX</code>, и <code class=\"gatsby-code-text\">.ts</code> для всего остального. </p>\n<h3 id=\"running-typescript\"><a href=\"#running-typescript\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Запуск TypeScript </h3>\n<p>Если всё было сделано правильно, можно попробовать скомпилировать TypeScript:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> build</code></pre></div>\n<p>Или <code class=\"gatsby-code-text\">npm</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">npm</span> run build</code></pre></div>\n<p>Если эта команда не вывела ничего в терминале, то процесс компиляции прошёл успешно.</p>\n<h3 id=\"type-definitions\"><a href=\"#type-definitions\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Определения типов </h3>\n<p>Для анализа ошибок и выдачи всплывающих подсказок компилятор TypeScript использует файлы объявлений. Они содержат в себе всю информацию о типах, которые используются в конкретной библиотеке. В свою очередь это позволяет нам использовать JavaScript библиотеки в проекте совместно с TypeScript. </p>\n<p>Существует два основных способа получения файлов объявлений:</p>\n<p><strong>Bundled</strong> — Библиотека устанавливается вместе с собственным файлом объявлений. Это прекрасный вариант для нас, так как всё, что нам нужно — установить нужный пакет. Чтобы проверить, есть ли у библиотеки файл объявлений, поищите <code class=\"gatsby-code-text\">index.d.ts</code> в её исходных файлах. В некоторых библиотеках наличие и расположение этого файла указываются в <code class=\"gatsby-code-text\">package.json</code> в секциях <code class=\"gatsby-code-text\">typings</code> или <code class=\"gatsby-code-text\">types</code>. </p>\n<p><strong><a href=\"https://github.com/DefinitelyTyped/DefinitelyTyped\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">DefinitelyTyped</a></strong> — это внушительный репозиторий файлов объявлений. Например, React устанавливается без собственного файла объявления — вместо этого мы устанавливаем его отдельно: </p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token comment\"># yarn</span>\n<span class=\"token function\">yarn</span> <span class=\"token function\">add</span> --dev @types/react\n\n<span class=\"token comment\"># npm</span>\n<span class=\"token function\">npm</span> i --save-dev @types/react</code></pre></div>\n<p><strong>Локальные объявления</strong>\nИногда пакет, который вы хотите использовать, не имеет ни собственного файла объявлений, ни соответствующего файла в репозитории DefinitelyTyped. В этом случае, мы можем объявить собственный локальный файл объявлений. Для этого надо создать файл <code class=\"gatsby-code-text\">declarations.d.ts</code> в корне директории, где лежат исходники вашего проекта. Файл объявлений может выглядеть примерно так: </p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"gatsby-code-typescript\"><code class=\"gatsby-code-typescript\"><span class=\"token keyword\">declare</span> <span class=\"token keyword\">module</span> <span class=\"token string\">'querystring'</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>val<span class=\"token operator\">:</span> object<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span>\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">parse</span><span class=\"token punctuation\">(</span>val<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> object\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Вот и всё, вы готовы писать код на TypeScript! Чтобы познакомиться с ним поближе, рекомендуем посетить эти ресурсы: </p>\n<ul>\n<li><a href=\"https://www.typescriptlang.org/docs/handbook/basic-types.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TypeScript Documentation: Basic Types</a></li>\n<li><a href=\"https://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TypeScript Documentation: Migrating from Javascript</a></li>\n<li><a href=\"https://www.typescriptlang.org/docs/handbook/react-&#x26;-webpack.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TypeScript Documentation: React and Webpack</a></li>\n</ul>\n<h2 id=\"reason\"><a href=\"#reason\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reason </h2>\n<p><a href=\"https://reasonml.github.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Reason</a> — это не новый язык, а новый синтаксис и набор инструментов для проверенного временем языка <a href=\"https://ocaml.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">OCaml</a>. Reason предоставляет синтаксис, ориентированный на JavaScript программистов, и использует уже известный всем способ распространения через NPM/Yarn.</p>\n<p>Reason был разработан в Facebook и используется в некоторых продуктах этой компании — например, в Messenger. Reason всё ещё считается довольно экспериментальным инструментом, но уже имеет <a href=\"https://reasonml.github.io/reason-react/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">библиотеку привязок для React</a>, поддерживаемую Facebook, а также <a href=\"https://reasonml.github.io/docs/en/community.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">отзывчивое сообщество</a></p>\n<h2 id=\"kotlin\"><a href=\"#kotlin\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Kotlin </h2>\n<p><a href=\"https://kotlinlang.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Kotlin</a> — это язык со статической типизацией, разработанный в JetBrains. Он нацелен на платформы работающие на основе JVM, Android, LLVM и <a href=\"https://kotlinlang.org/docs/reference/js-overview.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">JavaScript</a>. </p>\n<p>JetBrains разрабатывает и поддерживает несколько библиотек специально для сообщества React: <a href=\"https://github.com/JetBrains/kotlin-wrappers\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React bindings</a> совместно с <a href=\"https://github.com/JetBrains/create-react-kotlin-app\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Create React Kotlin App</a>. Последняя позволит вам начать использовать Kotlin вместе с React в одном проекте без необходимости ручной конфигурации.</p>\n<h2 id=\"other-languages\"><a href=\"#other-languages\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Другие языки </h2>\n<p>Помните: есть и другие языки со статической типизацией, которые могут компилироваться в JavaScript, а значит — совместимы с React. Например, <a href=\"https://fable.io\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">F#/Fable</a> вместе с <a href=\"https://elmish.github.io/react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">elmish-react</a>. Для подробной информации переходите на соответствующие сайты и не стесняйтесь предлагать больше React-совместимых статически типизированных языков в этот раздел!</p>","frontmatter":{"title":"Статическая типизация","next":null,"prev":null},"fields":{"path":"content/docs/static-type-checking.md","slug":"docs/static-type-checking.html"}}},"pageContext":{"slug":"docs/static-type-checking.html"}},"staticQueryHashes":[]}