HTML Diff
1 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Команда TypeScript сообщила 16 августа о выпуске предварительной версии (release candidate) TypeScript 3.6. В течение нескольких недель команда планирует стабилизировать предварительную версию. После этого TypeScript 3.6 выйдет официально.</p>
1 <p>Команда TypeScript сообщила 16 августа о выпуске предварительной версии (release candidate) TypeScript 3.6. В течение нескольких недель команда планирует стабилизировать предварительную версию. После этого TypeScript 3.6 выйдет официально.</p>
2 <p>Релиз кандидат доступен на<a>NuGet</a>. Также его можно установить через npm.</p>
2 <p>Релиз кандидат доступен на<a>NuGet</a>. Также его можно установить через npm.</p>
3 <p>Есть сборки для<a>Visual Studio</a>,<a>Visual Studio Code</a>и<a>Sublime Text</a>.</p>
3 <p>Есть сборки для<a>Visual Studio</a>,<a>Visual Studio Code</a>и<a>Sublime Text</a>.</p>
4 <p>Давайте посмотрим, какие возможности предлагает TypeScript 3.6.</p>
4 <p>Давайте посмотрим, какие возможности предлагает TypeScript 3.6.</p>
5 <h2>Содержание</h2>
5 <h2>Содержание</h2>
6 <ul><li><a>Строгие генераторы</a></li>
6 <ul><li><a>Строгие генераторы</a></li>
7 <li><a>Более точный оператор Array Spread</a></li>
7 <li><a>Более точный оператор Array Spread</a></li>
8 <li><a>Более удобные промисы</a></li>
8 <li><a>Более удобные промисы</a></li>
9 <li><a>Улучшена поддержка юникода в идентификаторах</a></li>
9 <li><a>Улучшена поддержка юникода в идентификаторах</a></li>
10 <li><a>Поддержка import.meta в System.js</a></li>
10 <li><a>Поддержка import.meta в System.js</a></li>
11 <li><a>Методы доступа get и set можно использовать в окружающем контексте</a></li>
11 <li><a>Методы доступа get и set можно использовать в окружающем контексте</a></li>
12 <li><a>Окружающие классы и функции можно объединять</a></li>
12 <li><a>Окружающие классы и функции можно объединять</a></li>
13 <li><a>API теперь поддерживают --build и --incremental</a></li>
13 <li><a>API теперь поддерживают --build и --incremental</a></li>
14 <li><a>Решена проблема точки с запятой</a></li>
14 <li><a>Решена проблема точки с запятой</a></li>
15 <li><a>Умный синтаксис автоимпорта</a></li>
15 <li><a>Умный синтаксис автоимпорта</a></li>
16 <li><a>Методы со строковым именем constructor становятся конструктором</a></li>
16 <li><a>Методы со строковым именем constructor становятся конструктором</a></li>
17 <li><a>Обновления DOM</a></li>
17 <li><a>Обновления DOM</a></li>
18 <li><a>Комментарии JSDoc не объединяются</a></li>
18 <li><a>Комментарии JSDoc не объединяются</a></li>
19 <li><a>Ключевые слова не могут содержать избегающие последовательности</a></li>
19 <li><a>Ключевые слова не могут содержать избегающие последовательности</a></li>
20 <li><a>Что дальше</a></li>
20 <li><a>Что дальше</a></li>
21 </ul><h2>Строгие генераторы</h2>
21 </ul><h2>Строгие генераторы</h2>
22 <p>В новой версии TypeScript предусмотрена строгая проверка функций итераторов и генераторов. В ранних версиях пользователи генераторов не могли определить, было ли значение возвращено из генератора или определено.</p>
22 <p>В новой версии TypeScript предусмотрена строгая проверка функций итераторов и генераторов. В ранних версиях пользователи генераторов не могли определить, было ли значение возвращено из генератора или определено.</p>
23 <p>Также генераторы ожидали, что типом yield по умолчанию является any.</p>
23 <p>Также генераторы ожидали, что типом yield по умолчанию является any.</p>
24 <p>TypeScript 3.6 ожидает, что в первом примере curr.value имеет тип string. Это возможно благодаря изменениям в определении типов в Iterator и IteratorResult. Также появился новый тип для представления генераторов: Generator.</p>
24 <p>TypeScript 3.6 ожидает, что в первом примере curr.value имеет тип string. Это возможно благодаря изменениям в определении типов в Iterator и IteratorResult. Также появился новый тип для представления генераторов: Generator.</p>
25 <p>Iterator в TypeScript 3.6 позволяет пользователям указывать тип принимаемых и возвращаемых данных, а также тип данных, которых принимает next.</p>
25 <p>Iterator в TypeScript 3.6 позволяет пользователям указывать тип принимаемых и возвращаемых данных, а также тип данных, которых принимает next.</p>
26 <p>Новый тип Generator всегда итерабельный, также у него всегда есть методы return и throw.</p>
26 <p>Новый тип Generator всегда итерабельный, также у него всегда есть методы return и throw.</p>
27 <p>TypeScript 3.6 конвертирует IteratorResult в различаемое объединение. Это позволяет определять разницу между получаемыми и возвращаемыми данными.</p>
27 <p>TypeScript 3.6 конвертирует IteratorResult в различаемое объединение. Это позволяет определять разницу между получаемыми и возвращаемыми данными.</p>
28 <p>В TypeScript 3.6 используется yield в теле функции-генератора. Это позволяет корректно представлять данные, которые передаются в генератор в результате вызова next().</p>
28 <p>В TypeScript 3.6 используется yield в теле функции-генератора. Это позволяет корректно представлять данные, которые передаются в генератор в результате вызова next().</p>
29 <p>Также в TypeScript 3.6 можно явно указывать тип данных, полученных из yield expression. В примере ниже next() можно выбрать только с типом данных boolean. В зависимости от значения done, value может быть строкой или числом.</p>
29 <p>Также в TypeScript 3.6 можно явно указывать тип данных, полученных из yield expression. В примере ниже next() можно выбрать только с типом данных boolean. В зависимости от значения done, value может быть строкой или числом.</p>
30 <p>Детали можно найти в<a>пулреквесте</a>.</p>
30 <p>Детали можно найти в<a>пулреквесте</a>.</p>
31 <h2>Более точный оператор Array Spread</h2>
31 <h2>Более точный оператор Array Spread</h2>
32 <p>До появления стандарта ES-2015 в циклах for/of или спред-операторах массивов были довольно неудобные emit’ы. Поэтому в TypeScript используется более простой дефолтный emit, который поддерживает только массивы. Также он поддерживает итерацию других типов данных с флагом --downlevelIteration. При использовании этого флага код получается более точным, но менее лаконичным.</p>
32 <p>До появления стандарта ES-2015 в циклах for/of или спред-операторах массивов были довольно неудобные emit’ы. Поэтому в TypeScript используется более простой дефолтный emit, который поддерживает только массивы. Также он поддерживает итерацию других типов данных с флагом --downlevelIteration. При использовании этого флага код получается более точным, но менее лаконичным.</p>
33 <p>Параметр --downlevelIteration в новой версии исключён, так как большинство пользователей пользуются итерацией по массивам. Тем не менее emit, который поддерживает только массивы, работает по-другому в некоторых пограничных случаях.</p>
33 <p>Параметр --downlevelIteration в новой версии исключён, так как большинство пользователей пользуются итерацией по массивам. Тем не менее emit, который поддерживает только массивы, работает по-другому в некоторых пограничных случаях.</p>
34 <p>Обратите внимание на пример ниже.</p>
34 <p>Обратите внимание на пример ниже.</p>
35 <p>Он эквивалентен массиву из следующего примера.</p>
35 <p>Он эквивалентен массиву из следующего примера.</p>
36 <p>Однако TypeScript трансформирует его в такой код.</p>
36 <p>Однако TypeScript трансформирует его в такой код.</p>
37 <p>В то же время Array(5) создаёт массив с длинной 5, но без определённых элементов.</p>
37 <p>В то же время Array(5) создаёт массив с длинной 5, но без определённых элементов.</p>
38 <p>При использовании метода slice() TypeScript создаёт массив, в котором значения не определены, но у которого есть индексы.</p>
38 <p>При использовании метода slice() TypeScript создаёт массив, в котором значения не определены, но у которого есть индексы.</p>
39 <p>Этот нюанс может показаться несущественным, но он доставляет неудобства специалистам. Поэтому в TypeScript 3.6 представлен новый инструмент __spreadArrays. Подробную информацию о нём можно найти в соответствующем<a>пулреквесте</a>.</p>
39 <p>Этот нюанс может показаться несущественным, но он доставляет неудобства специалистам. Поэтому в TypeScript 3.6 представлен новый инструмент __spreadArrays. Подробную информацию о нём можно найти в соответствующем<a>пулреквесте</a>.</p>
40 <h2>Более удобные промисы</h2>
40 <h2>Более удобные промисы</h2>
41 <p>Промисы - самый распространённый способ работы с асинхронными данными. Однако использование API, ориентированных на промисы, доставляет разработчикам неудобства. В TypeScript 3.6 улучшена работа с неправильно обрабатываемыми промисами.</p>
41 <p>Промисы - самый распространённый способ работы с асинхронными данными. Однако использование API, ориентированных на промисы, доставляет разработчикам неудобства. В TypeScript 3.6 улучшена работа с неправильно обрабатываемыми промисами.</p>
42 <p>Например, специалисты иногда забывают использовать .then() или await перед передачей промисов в другую функцию. Новая версия TypeScript сообщает об этой ошибке и предлагает пользователю использовать await.</p>
42 <p>Например, специалисты иногда забывают использовать .then() или await перед передачей промисов в другую функцию. Новая версия TypeScript сообщает об этой ошибке и предлагает пользователю использовать await.</p>
43 <p>Также разработчики иногда пытаются получить доступ к методу до использования await или .then(). Пример ниже показывает, как TypeScript 3.6 реагирует на эту ошибку.</p>
43 <p>Также разработчики иногда пытаются получить доступ к методу до использования await или .then(). Пример ниже показывает, как TypeScript 3.6 реагирует на эту ошибку.</p>
44 <p>То есть даже если пользователь не использует await, он получает дополнительную информацию, которая позволяет исправить ошибку.</p>
44 <p>То есть даже если пользователь не использует await, он получает дополнительную информацию, которая позволяет исправить ошибку.</p>
45 <p>Также появилась опция быстрого исправления описанной выше ошибки (см. иллюстрацию).</p>
45 <p>Также появилась опция быстрого исправления описанной выше ошибки (см. иллюстрацию).</p>
46 <p>Подробности смотрите<a>в соответствующем issue</a>.</p>
46 <p>Подробности смотрите<a>в соответствующем issue</a>.</p>
47 <h2>Улучшена поддержка юникода в идентификаторах</h2>
47 <h2>Улучшена поддержка юникода в идентификаторах</h2>
48 <p>В релиз кандидате TypeScript 3.6 улучшена поддержка юникода в идентификаторах. Пример ниже.</p>
48 <p>В релиз кандидате TypeScript 3.6 улучшена поддержка юникода в идентификаторах. Пример ниже.</p>
 
49 + <h2>Поддержка import.meta в System.js</h2>
49 <p>В TypeScript 3.6 включена поддержка трансформации import.meta в context.meta. Нагляднее в коде.</p>
50 <p>В TypeScript 3.6 включена поддержка трансформации import.meta в context.meta. Нагляднее в коде.</p>
50 <h2>Методы доступа get и set можно использовать в окружающем контексте</h2>
51 <h2>Методы доступа get и set можно использовать в окружающем контексте</h2>
51 <p>В более ранних версиях методы доступа get и set нельзя было использовать в окружающем контексте (например, в declare class). Теперь разработчики могут пользоваться геттерами и сеттерами.</p>
52 <p>В более ранних версиях методы доступа get и set нельзя было использовать в окружающем контексте (например, в declare class). Теперь разработчики могут пользоваться геттерами и сеттерами.</p>
52 <h2>Окружающие классы и функции можно объединять</h2>
53 <h2>Окружающие классы и функции можно объединять</h2>
53 <p>В ранних версиях TypeScript попытка объединить классы и функции приводила к ошибке в любом случае. В предварительной версии TypeScript 3.6 классы и функции с модификатором declare можно объединять.</p>
54 <p>В ранних версиях TypeScript попытка объединить классы и функции приводила к ошибке в любом случае. В предварительной версии TypeScript 3.6 классы и функции с модификатором declare можно объединять.</p>
54 <p>Это позволяет использовать такой код.</p>
55 <p>Это позволяет использовать такой код.</p>
55 <p>Раньше пришлось бы писать так.</p>
56 <p>Раньше пришлось бы писать так.</p>
56 <p>Благодаря этому можно использовать вызываемый конструктор, что обеспечивает объединение пространства имён. Подробности смотрите<a>в оригинальном пулреквексте</a>.</p>
57 <p>Благодаря этому можно использовать вызываемый конструктор, что обеспечивает объединение пространства имён. Подробности смотрите<a>в оригинальном пулреквексте</a>.</p>
57 <h2>API теперь поддерживают --build и --incremental</h2>
58 <h2>API теперь поддерживают --build и --incremental</h2>
58 <p>Начиная с версии 3.0 в TypeScript включена поддержка --build, а в версии 3.4 добавлена поддержка --incremental. Эти флаги позволяют гибко структурировать проекты и ускоряют разработку. К сожалению, --build и --incremental не работали со сторонними инструментами, например, Gulp или Webpack. В TypeScript 3.6 данная возможность появилась.</p>
59 <p>Начиная с версии 3.0 в TypeScript включена поддержка --build, а в версии 3.4 добавлена поддержка --incremental. Эти флаги позволяют гибко структурировать проекты и ускоряют разработку. К сожалению, --build и --incremental не работали со сторонними инструментами, например, Gulp или Webpack. В TypeScript 3.6 данная возможность появилась.</p>
59 <p>Чтобы создавать сборки с --incremental, разработчики могут использовать API createIncrementalProgram и createIncrementalCompilerHost. Новая функция readBuilderProgram позволяет использовать файлы из .tsbuildinfo, сгенерированные указанными API.</p>
60 <p>Чтобы создавать сборки с --incremental, разработчики могут использовать API createIncrementalProgram и createIncrementalCompilerHost. Новая функция readBuilderProgram позволяет использовать файлы из .tsbuildinfo, сгенерированные указанными API.</p>
60 <p>Подробности смотрите<a>в пулреквесте</a>.</p>
61 <p>Подробности смотрите<a>в пулреквесте</a>.</p>
61 <h2>Решена проблема точки с запятой</h2>
62 <h2>Решена проблема точки с запятой</h2>
62 <p>Редакторы и среды разработки типа<a>Visual Studio Code</a>и Visual Studio автоматически предлагают исправления и дополнения. Это реализовано с помощью TypeScript. Старые версии TypeScript автоматически добавляли точку с запятой в конце каждого выражения. Это неудобно для части пользователей, так как в некоторых стайлгайдах использование точки с запятой не предустматривается.</p>
63 <p>Редакторы и среды разработки типа<a>Visual Studio Code</a>и Visual Studio автоматически предлагают исправления и дополнения. Это реализовано с помощью TypeScript. Старые версии TypeScript автоматически добавляли точку с запятой в конце каждого выражения. Это неудобно для части пользователей, так как в некоторых стайлгайдах использование точки с запятой не предустматривается.</p>
63 <p>Новая версия TypeScript интеллектуально решает проблему точек с запятыми. Если в вашем проекте они используются, редактор их добавляет в код. В противном случае точки с запятыми не добавляются.</p>
64 <p>Новая версия TypeScript интеллектуально решает проблему точек с запятыми. Если в вашем проекте они используются, редактор их добавляет в код. В противном случае точки с запятыми не добавляются.</p>
64 <p>Детали<a>в пулреквесте</a>.</p>
65 <p>Детали<a>в пулреквесте</a>.</p>
65 <h2>Умный синтаксис автоимпорта</h2>
66 <h2>Умный синтаксис автоимпорта</h2>
66 <p>Старые версии TypeSript по умолчанию используют для автоимпорта синтаксис ECMAScript. Это неприемлемо для части проектов TypeScript с определёнными настройками компилятора, а также для проектов Node с использованием нативного JavaScript, где используется require.</p>
67 <p>Старые версии TypeSript по умолчанию используют для автоимпорта синтаксис ECMAScript. Это неприемлемо для части проектов TypeScript с определёнными настройками компилятора, а также для проектов Node с использованием нативного JavaScript, где используется require.</p>
67 <p>TypeScript 3.6 интеллектуально решает проблему автоимпортов. Для этого он изучает существующие импорты, которые уже используются в проекте.</p>
68 <p>TypeScript 3.6 интеллектуально решает проблему автоимпортов. Для этого он изучает существующие импорты, которые уже используются в проекте.</p>
68 <p>Подробнее<a>в пулреквесте</a>.</p>
69 <p>Подробнее<a>в пулреквесте</a>.</p>
69 <h2>Методы со строковым именем constructor становятся конструктором</h2>
70 <h2>Методы со строковым именем constructor становятся конструктором</h2>
70 <p>Методы с названием constructor считаются конструктором независимо от того, как они объявляются: с помощью идентификатора или строкового имени.</p>
71 <p>Методы с названием constructor считаются конструктором независимо от того, как они объявляются: с помощью идентификатора или строкового имени.</p>
71 <p>Важное исключение - вычисляемые значения остаются методами.</p>
72 <p>Важное исключение - вычисляемые значения остаются методами.</p>
72 <p>class D { ["constructor"]() { console.log("Я метод, а не конструктор!"); } }</p>
73 <p>class D { ["constructor"]() { console.log("Я метод, а не конструктор!"); } }</p>
73 <h2>Обновления DOM</h2>
74 <h2>Обновления DOM</h2>
74 <p>Ниже несколько важных изменений.</p>
75 <p>Ниже несколько важных изменений.</p>
75 <ul><li>Тип глобального объекта window изменился с Window на Window &amp; typeof globalThis.</li>
76 <ul><li>Тип глобального объекта window изменился с Window на Window &amp; typeof globalThis.</li>
76 <li>Вместо GlobalFetch используется WindowOrWorkerGlobalScope.</li>
77 <li>Вместо GlobalFetch используется WindowOrWorkerGlobalScope.</li>
77 <li>Вместо контекста experimental-webgl используется webgl или webgl2.</li>
78 <li>Вместо контекста experimental-webgl используется webgl или webgl2.</li>
78 </ul><h2>Комментарии JSDoc не объединяются</h2>
79 </ul><h2>Комментарии JSDoc не объединяются</h2>
79 <p>В проектах JavaScript TypeScript обращается к комментариям JSDoc, чтобы определить объявленный типы.</p>
80 <p>В проектах JavaScript TypeScript обращается к комментариям JSDoc, чтобы определить объявленный типы.</p>
80 <h2>Ключевые слова не могут содержать избегающие последовательности</h2>
81 <h2>Ключевые слова не могут содержать избегающие последовательности</h2>
81 <p>В релиз кандидате вводится запрет на использование избегающих последовательностей в ключевых словах.</p>
82 <p>В релиз кандидате вводится запрет на использование избегающих последовательностей в ключевых словах.</p>
82 <h2>Что дальше</h2>
83 <h2>Что дальше</h2>
83 <p>Команда TypeScript<a>ждёт обратную связь</a>по релиз кандидату TypeScript 3.6. Полученные данные помогут выпустить официальную версию TypeScript.</p>
84 <p>Команда TypeScript<a>ждёт обратную связь</a>по релиз кандидату TypeScript 3.6. Полученные данные помогут выпустить официальную версию TypeScript.</p>
84 <p><em>Адаптированный перевод статьи<a>Announcing TypeScript 3.6 RC</a>. Мнение администрации "Хекслета" может не совпадать с мнением автора оригинальной публикации.</em></p>
85 <p><em>Адаптированный перевод статьи<a>Announcing TypeScript 3.6 RC</a>. Мнение администрации "Хекслета" может не совпадать с мнением автора оригинальной публикации.</em></p>