TypeScript 5.3–5.4: новое сужение типов и NoInfer
Применяйте служебный тип NoInfer и новое сужение в switch/case
«TypeScript 5.3–5.4: новое сужение типов и NoInfer» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Обзор TypeScript 5.3
В TypeScript 5.3 (ноябрь 2023 года) появились улучшенное сужение типов в конструкциях выбора, поддержка импорта типов в JSDoc и режим разрешения в import type.
// npm install typescript@5.3Улучшение сужения типов в конструкциях выбора
TS 5.3 улучшил сужение типов внутри операторов switch, особенно для объединений с дискриминантом, содержащих несколько вариантов.
type Result = { status: "ok"; data: string } | { status: "err"; code: number };
function handle(r: Result) {
switch (r.status) {
case "ok":
console.log(r.data); // r: { status: "ok"; data: string } — narrowed
break;
case "err":
console.log(r.code); // r: { status: "err"; code: number } — narrowed
break;
}
}Импорт типов в JSDoc
В TS 5.3 появилась поддержка тега JSDoc @import для импорта только типов в файлах JavaScript.
/** @import { User } from "./types.js" */
/** @param {User} user */
function greet(user) {
console.log(user.name);
}Режим разрешения для импорта типов
TS 5.3 позволяет указывать resolution-mode в import type, чтобы управлять тем, будет ли импорт разрешён как CommonJS или ESM.
import type { User } from "some-library" with { "resolution-mode": "require" };Обзор TypeScript 5.4
В TypeScript 5.4 (март 2024 года) появился служебный тип NoInfer, сохранилось сужение типов в замыканиях, а также появились типы для Object.groupBy и Map.groupBy.
// npm install typescript@5.4Служебный тип NoInfer<T>
NoInfer не позволяет TypeScript использовать обобщённый аргумент как место вывода типов, заставляя выводить тип только из других аргументов.
function createStore<T>(initial: T, onChange: (val: NoInfer<T>) => void) {
// T inferred from initial, not from onChange callback
}
createStore({ count: 0 }, (val) => {
// val: { count: number } — inferred from initial only
});Зачем нужен NoInfer
Без NoInfer TypeScript пытался бы вывести T из обоих аргументов и мог бы неожиданно расширить тип.
// Before NoInfer: T may be widened by the callback
function createStore<T>(initial: T, onChange: (val: T) => void) {}
createStore({ count: 0 }, (val: { count: number; extra: string }) => {});
// T widened to include extra — not what we wantСохранение сужения типов после замыканий
TS 5.4 сохраняет сужение типов в замыканиях, если после создания замыкания суженной переменной не присваивается новое значение.
function process(val: string | null) {
if (!val) return;
// val: string
setTimeout(() => {
console.log(val.toUpperCase()); // TS 5.4: still string — not widened
}, 100);
}Типизация Object.groupBy
В TS 5.4 появились типы для статических методов Object.groupBy и Map.groupBy из ES2024.
const users = [
{ name: "Alice", role: "admin" },
{ name: "Bob", role: "user" },
];
const grouped = Object.groupBy(users, (u) => u.role);
// grouped: { [role: string]: { name: string; role: string }[] }Улучшенный вывод объявлений
TS 5.4 улучшил вывод файлов объявлений в сложных случаях с отображаемыми и условными типами, уменьшив количество ложных ошибок в создаваемых файлах .d.ts.
// Fewer "Type ... is not assignable to type ..." errors
// in generated declaration files from TS 5.4 onwardИтоги: TS 5.3–5.4
TS 5.3: улучшенное сужение типов в конструкциях выбора и поддержка @import в JSDoc. TS 5.4: NoInfer для блокировки нежелательных мест вывода типов, сохранение сужения в замыканиях и типы Object.groupBy.
Быстрая проверка
Что предотвращает NoInfer?
Чему вы научились
TS 5.3 улучшил сужение типов в конструкциях выбора и добавил типы импорта в JSDoc. В TS 5.4 появился NoInfer для управления местами вывода типов, сохранилось сужение через замыкания и появились типы Object.groupBy для ES2024.
Часто задаваемые вопросы
Урок «TypeScript 5.3–5.4: новое сужение типов и NoInfer» бесплатный?
Да — полный текст урока «TypeScript 5.3–5.4: новое сужение типов и NoInfer» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «TypeScript 5.3–5.4: новое сужение типов и NoInfer»?
Применяйте служебный тип NoInfer и новое сужение в switch/case Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «TypeScript 5.3–5.4: новое сужение типов и NoInfer»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- TypeScript 5.0: стандартные декораторы и параметры типов const
- TypeScript 5.1–5.2: улучшенный вывод типов
- TypeScript 5.3–5.4: новое сужение типов и NoInfer
- TypeScript 5.5+: изолированные объявления и далее