HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#Руководства</a></p>
1 <p><a>#Руководства</a></p>
2 <ul><li>1 июл 2020</li>
2 <ul><li>1 июл 2020</li>
3 <li>0</li>
3 <li>0</li>
4 - </ul><p>Frontend-разработка шагнула далеко за пределы JavaScript. Разбираемся, что такое TypeScript и почему его так любят.</p>
4 + </ul><p>Frontend-разработк шагнула далеко за пределы JavaScript. Разбираемся, что такое TypeScript и почему его так любят.</p>
5 <p> vlada_maestro / shutterstock</p>
5 <p> vlada_maestro / shutterstock</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7 <p>На JavaScript написаны веб-интерфейсы практически всех сайтов. Однако не все его любят, а альтернатив почти нет. Единственный конкурент JS - WebAssembly, однако за несколько лет своего существования он пока не смог стать достаточно популярным.</p>
7 <p>На JavaScript написаны веб-интерфейсы практически всех сайтов. Однако не все его любят, а альтернатив почти нет. Единственный конкурент JS - WebAssembly, однако за несколько лет своего существования он пока не смог стать достаточно популярным.</p>
8 <p>Из-за такого расклада у разработчиков остаётся два выхода:</p>
8 <p>Из-за такого расклада у разработчиков остаётся два выхода:</p>
9 <ul><li>Использовать JS со всеми его недостатками.</li>
9 <ul><li>Использовать JS со всеми его недостатками.</li>
10 <li>Писать код на другом языке и компилировать его в JS.</li>
10 <li>Писать код на другом языке и компилировать его в JS.</li>
11 </ul><p>И многие выбирают второе решение. Поэтому за последние годы появилось сразу несколько языков-надстроек над JavaScript:</p>
11 </ul><p>И многие выбирают второе решение. Поэтому за последние годы появилось сразу несколько языков-надстроек над JavaScript:</p>
12 <ul><li>Dart;</li>
12 <ul><li>Dart;</li>
13 <li>CoffeeScript;</li>
13 <li>CoffeeScript;</li>
14 <li>ClojureScript;</li>
14 <li>ClojureScript;</li>
15 <li>TypeScript.</li>
15 <li>TypeScript.</li>
16 </ul><p>О последнем и пойдёт речь в этой статье. В 2019 году TypeScript стал одним из самых любимых языков программирования и попал в топ-10 по популярности:</p>
16 </ul><p>О последнем и пойдёт речь в этой статье. В 2019 году TypeScript стал одним из самых любимых языков программирования и попал в топ-10 по популярности:</p>
17 <p>TypeScript - это язык программирования, в котором исправлены многие недостатки JavaScript. Код на TypeScript выглядит почти так же, как и код на JS, и, если у вас есть опыт frontend-разработки, изучить TypeScript достаточно просто. Особенно учитывая, что вы можете писать JS-код прямо в TS-скриптах.</p>
17 <p>TypeScript - это язык программирования, в котором исправлены многие недостатки JavaScript. Код на TypeScript выглядит почти так же, как и код на JS, и, если у вас есть опыт frontend-разработки, изучить TypeScript достаточно просто. Особенно учитывая, что вы можете писать JS-код прямо в TS-скриптах.</p>
18 <p>Код на TypeScript компилируется в JS и подходит для разработки любых проектов под любые браузеры - тем более что можно выбрать версию JS, в которую будет компилироваться код.</p>
18 <p>Код на TypeScript компилируется в JS и подходит для разработки любых проектов под любые браузеры - тем более что можно выбрать версию JS, в которую будет компилироваться код.</p>
19 <p>TypeScript - проект с открытым исходным кодом, поэтому он очень быстро развивается. Многое, что появляется в TS, позже переходит и в JavaScript: например,<a>let и const</a>, стрелочные функции и так далее.</p>
19 <p>TypeScript - проект с открытым исходным кодом, поэтому он очень быстро развивается. Многое, что появляется в TS, позже переходит и в JavaScript: например,<a>let и const</a>, стрелочные функции и так далее.</p>
20 <p>Давайте разберём два главных преимущества TS перед JS.</p>
20 <p>Давайте разберём два главных преимущества TS перед JS.</p>
21 <p>Многие проблемы в JavaScript появляются из-за динамической типизации и в целом странного поведения типов данных:</p>
21 <p>Многие проблемы в JavaScript появляются из-за динамической типизации и в целом странного поведения типов данных:</p>
22 <p>В TypeScript типизация статическая, что избавляет от множества проблем. Есть числовой тип, строковый, логический и другие. Возможно описывать и свои типы данных, например, с помощью<em>enum</em>:</p>
22 <p>В TypeScript типизация статическая, что избавляет от множества проблем. Есть числовой тип, строковый, логический и другие. Возможно описывать и свои типы данных, например, с помощью<em>enum</em>:</p>
23 //Создаём перечисление Direction, в котором находятся направления (вверх, вниз, влево, вправо и никуда) enum Direction { Up, Down, Left, Right, None } //Переменной d можно указать направление let d : Direction = Direction.Up;<p>И в JS, и в TS есть поддержка объектно-ориентированного программирования: классы, объекты, наследование. Однако TypeScript шагнул чуть дальше и использует больше возможностей ОПП. В том числе, например, интерфейсы:</p>
23 //Создаём перечисление Direction, в котором находятся направления (вверх, вниз, влево, вправо и никуда) enum Direction { Up, Down, Left, Right, None } //Переменной d можно указать направление let d : Direction = Direction.Up;<p>И в JS, и в TS есть поддержка объектно-ориентированного программирования: классы, объекты, наследование. Однако TypeScript шагнул чуть дальше и использует больше возможностей ОПП. В том числе, например, интерфейсы:</p>
24 //Объявляем интерфейс interface IPost { id: number; text: string; } //Создаём классы, которые реализуют этот интерфейс class Message implements IPost { id: number; text: string; senderId: number; recieverId: number; } class ArticleComment implements IPost { id: number; text: string; senderId: number; articleId: number; }<p>Другой большой плюс - модификаторы доступа. Их в TypeScript три:<em>public, private</em>и<em>protected</em>. Вот пример их использования:</p>
24 //Объявляем интерфейс interface IPost { id: number; text: string; } //Создаём классы, которые реализуют этот интерфейс class Message implements IPost { id: number; text: string; senderId: number; recieverId: number; } class ArticleComment implements IPost { id: number; text: string; senderId: number; articleId: number; }<p>Другой большой плюс - модификаторы доступа. Их в TypeScript три:<em>public, private</em>и<em>protected</em>. Вот пример их использования:</p>
25 class User { //Приватные члены класса, которые недоступны извне private id: number; private login: number; constructor(id: number, login: number) { this.id = id; this.login = login; } //Аксессор в стиле Java public GetId(): number { return this.id; } //Аксессор в стиле C# public get Login(): number { return this.login; } }<p>Также есть и другие возможности:</p>
25 class User { //Приватные члены класса, которые недоступны извне private id: number; private login: number; constructor(id: number, login: number) { this.id = id; this.login = login; } //Аксессор в стиле Java public GetId(): number { return this.id; } //Аксессор в стиле C# public get Login(): number { return this.login; } }<p>Также есть и другие возможности:</p>
26 <ul><li>определение полей в конструкторе;</li>
26 <ul><li>определение полей в конструкторе;</li>
27 <li>преобразование типов;</li>
27 <li>преобразование типов;</li>
28 <li>абстрактные классы;</li>
28 <li>абстрактные классы;</li>
29 <li>обобщение и так далее.</li>
29 <li>обобщение и так далее.</li>
30 </ul><p>В будущем всё это может появиться и в JavaScript, но браузеры начнут поддерживать такие возможности ещё очень нескоро.</p>
30 </ul><p>В будущем всё это может появиться и в JavaScript, но браузеры начнут поддерживать такие возможности ещё очень нескоро.</p>
31 <p>Разработчики любят этот язык, а некоторые крупные проекты уже переходят на него. Например, популярный фреймворк Angular.JS. Но этого всё равно недостаточно, чтобы он стал таким же востребованным, как JavaScript. Это связано с тем, что разработка веб-приложения на TypeScript стоит дороже и отнимает больше времени.</p>
31 <p>Разработчики любят этот язык, а некоторые крупные проекты уже переходят на него. Например, популярный фреймворк Angular.JS. Но этого всё равно недостаточно, чтобы он стал таким же востребованным, как JavaScript. Это связано с тем, что разработка веб-приложения на TypeScript стоит дороже и отнимает больше времени.</p>
32 <p>Особенно если необходимо использовать какую-нибудь библиотеку или фреймворк, которые не портированы на TS. В этом случае разработчикам придётся самостоятельно описывать сигнатуры (указывать типы данных) всех функций и методов - достаточно длительный процесс, учитывая размеры современных библиотек.</p>
32 <p>Особенно если необходимо использовать какую-нибудь библиотеку или фреймворк, которые не портированы на TS. В этом случае разработчикам придётся самостоятельно описывать сигнатуры (указывать типы данных) всех функций и методов - достаточно длительный процесс, учитывая размеры современных библиотек.</p>
33 <p>Также порог входа в TypeScript выше - чтобы использовать его преимущества, важно знать типы данных и объектно-ориентированное программирование.</p>
33 <p>Также порог входа в TypeScript выше - чтобы использовать его преимущества, важно знать типы данных и объектно-ориентированное программирование.</p>
34 <p>Чтобы использовать TypeScript, установите сначала Node.JS. Как это сделать, можете прочитать в <a>нашей статье</a>. После этого введите в консоли команду:</p>
34 <p>Чтобы использовать TypeScript, установите сначала Node.JS. Как это сделать, можете прочитать в <a>нашей статье</a>. После этого введите в консоли команду:</p>
35 <p>npm install -g typescript</p>
35 <p>npm install -g typescript</p>
36 <p>Теперь создайте в папке со скриптами файл с расширением<em>.ts</em> - в нём мы будем писать код. Для компиляции кода пригодится команда<em>tsc</em>. Чтобы скомпилировать файл<em>app.ts</em>, введите команду:</p>
36 <p>Теперь создайте в папке со скриптами файл с расширением<em>.ts</em> - в нём мы будем писать код. Для компиляции кода пригодится команда<em>tsc</em>. Чтобы скомпилировать файл<em>app.ts</em>, введите команду:</p>
37 <p>Если всё пройдёт успешно, то в папке появится файл<em>app.js</em>, который и подключим к странице.</p>
37 <p>Если всё пройдёт успешно, то в папке появится файл<em>app.js</em>, который и подключим к странице.</p>
38 <p>Также можно составить конфиг в файле<em>tsconfig.json</em>, чтобы максимально упростить компиляцию<em>.</em></p>
38 <p>Также можно составить конфиг в файле<em>tsconfig.json</em>, чтобы максимально упростить компиляцию<em>.</em></p>
39 { "compilerOptions": { "target": "es5", "removeComments": true, "outFile": "app.js" } }<p>В <em>compilerOptions</em>хранятся все параметры для компилятора:</p>
39 { "compilerOptions": { "target": "es5", "removeComments": true, "outFile": "app.js" } }<p>В <em>compilerOptions</em>хранятся все параметры для компилятора:</p>
40 <ul><li><strong>target</strong> - стандарт JS, в который компилируется код. Здесь указан ECMAScript 5, потому что он поддерживается всеми современными браузерами;</li>
40 <ul><li><strong>target</strong> - стандарт JS, в который компилируется код. Здесь указан ECMAScript 5, потому что он поддерживается всеми современными браузерами;</li>
41 <li><strong>removeComments</strong> - параметр определяет, нужно ли удалять комментарии;</li>
41 <li><strong>removeComments</strong> - параметр определяет, нужно ли удалять комментарии;</li>
42 <li><strong>outFile</strong> - файл, в который сохраняется JS-код.</li>
42 <li><strong>outFile</strong> - файл, в который сохраняется JS-код.</li>
43 </ul><p>Теперь достаточно просто вводить команду<em>tsc</em>без параметров, чтобы скомпилировать наш TypeScript. Обратите внимание, что компилятор затронет все файлы с расширением<em>.ts</em>в текущей директории.</p>
43 </ul><p>Теперь достаточно просто вводить команду<em>tsc</em>без параметров, чтобы скомпилировать наш TypeScript. Обратите внимание, что компилятор затронет все файлы с расширением<em>.ts</em>в текущей директории.</p>
44 <p>Теперь создадим простой калькулятор и посмотрим, как отличается код для него на JS и на TS. Сначала сверстаем форму:</p>
44 <p>Теперь создадим простой калькулятор и посмотрим, как отличается код для него на JS и на TS. Сначала сверстаем форму:</p>
45 &lt;input type="number" id="num1" value="0"/&gt; + &lt;input type="number" id="num2" value="0"/&gt; &lt;br /&gt; &lt;button id="btn"&gt;=&lt;/button&gt; &lt;div id="result"&gt;&lt;/div&gt;<p>Здесь два поля для ввода чисел, кнопка, которая запускает скрипт и элемент для вывода результата:</p>
45 &lt;input type="number" id="num1" value="0"/&gt; + &lt;input type="number" id="num2" value="0"/&gt; &lt;br /&gt; &lt;button id="btn"&gt;=&lt;/button&gt; &lt;div id="result"&gt;&lt;/div&gt;<p>Здесь два поля для ввода чисел, кнопка, которая запускает скрипт и элемент для вывода результата:</p>
46 <p>Код TypeScript выглядит так:</p>
46 <p>Код TypeScript выглядит так:</p>
47 //Получая элемент, мы можем указать, какого он типа //В данном случае - поле ввода //Это говорит, что полученный элемент точно содержит свойства value и valueAsNumber, которые нам нужны //Если мы не укажем тип HTMLInputElement, компилятор не поймет, что у этого элемента есть свойство value, и откажется компилировать const num1 = &lt;HTMLInputElement&gt;document.getElementById("num1"); const num2 = &lt;HTMLInputElement&gt;document.getElementById("num2"); //Можно и не указывать тип элемента, если вам не нужны какие-то специфические свойства const result = document.getElementById("result"); const btn = document.getElementById("btn"); //Пока ещё не все современные браузеры поддерживают стрелочные функции, но компилятор TypeScript заменит её на обычную анонимную функцию //При условии, что в конфиге указана спецификация es5 btn.addEventListener("click", (e) =&gt; { Sum(); }); function Sum() { //В эту переменную можно добавить только числовое значение //Однако ввод всё равно стоит проверять, потому что пользователь может ввести что угодно вместо числа let sum : number = num1.valueAsNumber + num2.valueAsNumber; //Тип свойства innerHTML - string, поэтому мы должны конвертировать переменную sum в строку result.innerHTML = sum.toString(); }<p>А скомпилированный JS-код для такого калькулятора выглядит вот так:</p>
47 //Получая элемент, мы можем указать, какого он типа //В данном случае - поле ввода //Это говорит, что полученный элемент точно содержит свойства value и valueAsNumber, которые нам нужны //Если мы не укажем тип HTMLInputElement, компилятор не поймет, что у этого элемента есть свойство value, и откажется компилировать const num1 = &lt;HTMLInputElement&gt;document.getElementById("num1"); const num2 = &lt;HTMLInputElement&gt;document.getElementById("num2"); //Можно и не указывать тип элемента, если вам не нужны какие-то специфические свойства const result = document.getElementById("result"); const btn = document.getElementById("btn"); //Пока ещё не все современные браузеры поддерживают стрелочные функции, но компилятор TypeScript заменит её на обычную анонимную функцию //При условии, что в конфиге указана спецификация es5 btn.addEventListener("click", (e) =&gt; { Sum(); }); function Sum() { //В эту переменную можно добавить только числовое значение //Однако ввод всё равно стоит проверять, потому что пользователь может ввести что угодно вместо числа let sum : number = num1.valueAsNumber + num2.valueAsNumber; //Тип свойства innerHTML - string, поэтому мы должны конвертировать переменную sum в строку result.innerHTML = sum.toString(); }<p>А скомпилированный JS-код для такого калькулятора выглядит вот так:</p>
48 var num1 = document.getElementById("num1"); var num2 = document.getElementById("num2"); var result = document.getElementById("result"); var btn = document.getElementById("btn"); btn.addEventListener("click", function (e) { Sum(); }); function Sum() { var sum = num1.valueAsNumber + num2.valueAsNumber; result.innerHTML = sum.toString(); }<p>Несмотря на то что в TypeScript очень достойный синтаксис, JavaScript ещё долго будет доминировать во frontend-разработке. Поэтому его в любом случае нужно знать, даже если он вам не нравится.</p>
48 var num1 = document.getElementById("num1"); var num2 = document.getElementById("num2"); var result = document.getElementById("result"); var btn = document.getElementById("btn"); btn.addEventListener("click", function (e) { Sum(); }); function Sum() { var sum = num1.valueAsNumber + num2.valueAsNumber; result.innerHTML = sum.toString(); }<p>Несмотря на то что в TypeScript очень достойный синтаксис, JavaScript ещё долго будет доминировать во frontend-разработке. Поэтому его в любом случае нужно знать, даже если он вам не нравится.</p>
49 <a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>
49 <a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>