0Pricing
TypeScript Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. TypeScript 5.0: стандартные декораторы и параметры типов const
  2. TypeScript 5.1–5.2: улучшенный вывод типов
  3. TypeScript 5.3–5.4: новое сужение типов и NoInfer
  4. TypeScript 5.5+: изолированные объявления и далее
← Назад к TypeScript Academy