Что нового в TypeScript 4.6? – CloudSavvy ИТ

Логотип TypeScript на темно-синем фоне

TypeScript 4.6 — это первый в этом году функциональный выпуск надмножества статически типизированного JavaScript. Он добавляет несколько улучшений, касающихся конструкторов, компиляции и анализа кода. Есть также несколько критических изменений, о которых следует знать перед обновлением.

Усовершенствования анализа потока управления

В этом выпуске реализовано несколько улучшений возможностей анализа потока управления TypeScript. Они лучше оснащены TypeScript для более точного понимания того, как работает ваш код, что приводит к более узким определениям типов и меньшему количеству непредвиденных ошибок.

Первое изменение касается дискриминантных объединений свойств, которые были деструктурированы из объектов. Это применимо к случаям, когда вы работаете с типами объединения, состоящими из нескольких объектов. Отдельные объекты в объединении могут иметь разные определения типов, но по-прежнему иметь общие ключи.

Обычно эти общие ключи используются для условной проверки других частей структуры данных. TypeScript раньше выдавал ошибку при использовании этого рабочего процесса с назначением деструктурирования. Синтаксис деструктурирования создал совершенно новые переменные, лишенные ассоциации, связывающей их как свойства объекта. Теперь компилятор запоминает, что значения были получены из одного и того же объекта, что позволяет писать более простой код.

В объявлении о выпуске используется пример, подобный этому:

введите Действие = | {вид: «Число», данные: число} | {вид: «Строка», данные: строка}; дескриптор функции (действие: действие) { const {вид, данные} = действие; if (kind === «Число») { const Square = (данные * данные); } else if (kind === «String») { const lines = data.split(«\n»); } }

TypeScript 4.5 не разрешил бы этот код. Деструктурирующее присваивание (const {kind, data}) создало две независимые переменные; компилятор не мог понять, что тип Number означает, что данные должны быть числового типа. Теперь он распознает этот факт, позволяя вам использовать синтаксис деструктуризации с размеченными объединениями.

Анализ потока управления также был усилен вокруг зависимых параметров. Этот синтаксис позволяет задавать сложные правила для природы вариативных параметров. Вот определение типа функции, использующей это поведение:

введите Func = (…аргументы: [«Number», number], [«String», string]) => пустота;

Сигнатура этой функции указывает, что вы можете передать либо String, либо Number в качестве ее первого параметра. Если вы используете Number, следующим параметром должно быть значение типа number. В качестве альтернативы можно указать строку, если она следует за строкой.

Как и в приведенном выше примере с размеченными объединениями, TypeScript теперь сужает тип зависимых параметров на основе значений, которые им предшествовали:

const demo: Func = (вид, данные) => { if (вид === «Число») { const square = (данные * данные); } else if (kind === «String») { const lines = data.split(«\n»); } };

Теперь компилятор понимает, что данные должны быть числовыми, если вид равен числу. Этот код выдал бы ошибку с TypeScript 4.5.

Усовершенствования конструктора

Конструкторы классов JavaScript, которые расширяют родителя, должны вызывать super(), прежде чем можно будет использовать ключевое слово this:

// Не разрешено — «это» используется перед расширением «супер» класса B A {structor() { this.demo = «foobar»; супер(); } } // Работает правильный класс порядка C extends A {structor() { super(); this.demo = «foobar»; } }

Исторически TypeScript слишком строго соблюдал это требование. Классы, содержащие инициализаторы свойств, будут отвергнуты, если они будут иметь какой-либо код перед оператором super(), даже если он никогда не ссылался на это:

const пример = () => ноль; класс C расширяет A { demoProperty = true; // Бесполезно рассматривается как неверный конструктор() { example(); супер(); } }

Эта обработка помогла оптимизировать проверки TypeScript на наличие подлинных экземпляров this, которые использовались до super(). Это также привело к тому, что большое количество приемлемого кода не смогло скомпилироваться, что вынудило авторов провести рефакторинг работы, которая на самом деле была действительным JavaScript.

TypeScript 4.6 решает эту проблему. Теперь компилятор соответствует ванильному JavaScript, разрешая код перед super(), если это не приведет к его использованию. Это дает вам больше свободы для написания конструкторов классов наиболее целесообразным для каждой ситуации способом. TypeScript по-прежнему будет обнаруживать любые реальные случаи ссылки на это слишком рано.

Дополнительные улучшения логического вывода

Выводы индексированного доступа теперь более точны. Это дает компилятору видимость индексированных типов доступа, которые индексируют сопоставленные объекты. Хотя это уже было возможно раньше, старые выпуски TypeScript давали вывод низкого качества, который не всегда полностью осознавал типы отображаемых объектов.

Проверки глубины рекурсии TypeScript также были скорректированы, чтобы обеспечить лучшее обнаружение несовместимых рекурсивных типов. Это изменение может повысить производительность проверки типов, поскольку оно облегчает более раннее аварийное завершение работы, когда рекурсия типа начинает бесконечно расширяться. Усовершенствования сосредоточены на том, как рекурсия применяется к типам, использующим универсальные шаблоны.

Таргетинг ES2022

Флаг —target получил поддержку es2022 в качестве значения. Он позволяет в полной мере использовать функции ES2022, обеспечивая сохранение синтаксиса, такого как поля класса и свойство Error.cause, без транспиляции в ваших стабильных сборках.

Вы можете настроить таргетинг на ES2022, передав флаг —target es2022 в tsc. В качестве альтернативы изменитеcompileOptions.target на es2022 в файле tsconfig.json вашего проекта:

{ «compilerOptions»: { «цель»: «es2022» } }

Другие ошибки синтаксиса и привязки JavaScript

TypeScript теперь отображает больше стандартного синтаксиса JavaScript и ошибок привязки. Эти ошибки будут отображаться во время компиляции и при открытии файлов в редакторе с установленным расширением TypeScript для Visual Studio, Visual Studio Code или Sublime Text.

Повторяющиеся операторы const, неправильное использование ключевых слов и ошибки области действия теперь будут обнаруживаться TypeScript, предоставляя вам немедленную обратную связь во время работы. Функционал можно отключить, добавив комментарий // @ts-nocheck вверху ваших исходных файлов.

Это дополнение представляет собой критическое изменение, поскольку исходные файлы теперь должны содержать грамматически правильный JavaScript. Ранее компилятор TypeScript игнорировал большинство синтаксических ошибок JavaScript. Вы должны использовать комментарий, чтобы отключить эту функцию, если вы считаете, что ваша кодовая база будет несовместима с этим принудительным исполнением.

Еще одно критическое изменение

В этом обновлении есть второе критическое изменение: выражения остатка объекта теперь удаляют нерасширяемые члены из универсальных объектов. Это улучшает согласованность при деструктурировании необобщенных типов, но означает, что ваши существующие переменные могут не иметь некоторых свойств, которыми они обладали в TypeScript 4.5.

Свойства с нерасширяемыми значениями, такие как скаляры и функции, будут исключены из остальных выражений. Это также относится к другим нераспространяемым случаям, таким как непубличные члены экземпляров класса и this. Такой код раньше работал, но теперь выдает ошибку:

демо-класс { prop = «пример»; sayHello() { console.log(«Привет, мир»); } methodWithRest() { const {prop, …rest} = this; // ОШИБКА — Нераспространяемое значение (функция) будет удалено rest.sayHello(); } }

Резюме

TypeScript 4.6 улучшает вывод типов, улучшает обработку конструктора дочернего класса и добавляет ES2022 в качестве поддерживаемой цели вывода. Есть также несколько узких критических изменений в виде расширенного обнаружения синтаксических ошибок JavaScript и удаления нерасширяемых членов выражения остатка объекта. Вы можете перейти на новую версию, запустив npm update typescript или npm install typescript@latest в рабочем каталоге вашего проекта.

Обновление также знаменует собой дебют нового расширенного инструмента для анализа существующих трассировок генерации типов TypeScript. Анализатор трассировки работает с выходными данными команды tsc —generateTrace, чтобы помочь вам точно определить, насколько сложные выражения типа замедляют работу компилятора.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован.