0Pricing
TypeScript Academy · Урок

Ограничения обобщений: сужение параметров типов

Используйте extends, чтобы обеспечить выполнение требований к структуре обобщений

«Ограничения обобщений: сужение параметров типов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Добро пожаловать

Расширенные ограничения обобщённых типов позволяют сузить набор типов, которые можно использовать как аргументы типов, и тем самым выполнять типобезопасные операции со сложными структурами.

Повторение ограничений

T extends U ограничивает T типами, являющимися подтипами U. Благодаря этому TypeScript знает структуру T внутри функции.
function len<T extends { length: number }>(val: T): number {
  return val.length;
}

Ограничение конкретными методами

Потребуйте, чтобы T содержал определённый метод, задав ограничение в виде интерфейса с этим методом.
interface Stringable { toString(): string; }
function stringify<T extends Stringable>(val: T): string {
  return val.toString();
}

Вывод из ограничения

Используйте keyof внутри ограничения, чтобы создавать безопасные функции доступа.
function pluck<T, K extends keyof T>(items: T[], key: K): T[K][] {
  return items.map(item => item[key]);
}
const names = pluck(users, 'name'); // string[]

Ограничения высших порядков (имитация)

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

Ограничение примитивными типами

Ограничивайте параметры типов определёнными примитивными типами для специализированных функций.
type Primitive = string | number | boolean | bigint | symbol | null | undefined;
function isPrimitive<T extends Primitive>(val: T): true { return true; }

Рекурсивные ограничения

Ограничения могут ссылаться сами на себя для реализации рекурсивных шаблонов.
interface Comparable<T> { compareTo(other: T): number; }
function sort<T extends Comparable<T>>(items: T[]): T[] {
  return [...items].sort((a, b) => a.compareTo(b));
}

Ограничение со значением по умолчанию

Параметр типа может иметь одновременно ограничение и значение по умолчанию. Значение по умолчанию должно удовлетворять ограничению.
function process<T extends object = Record<string, unknown>>(data: T): void {
  console.log(Object.keys(data));
}

T extends Record<string, unknown>

Ограничьте тип типом записи, чтобы обеспечить динамический доступ к свойствам.
function getValue<T extends Record<string, unknown>>(obj: T, key: string): unknown {
  return obj[key];
}

Вывод ограничений в возвращаемых типах

Когда T ограничен, TypeScript использует это ограничение, чтобы определить допустимые операции с возвращаемым типом.
function firstKey<T extends object>(obj: T): keyof T {
  return Object.keys(obj)[0] as keyof T;
}

Утилита NoInfer (TS 5.4)

В TypeScript 5.4 появилась утилита NoInfer, предотвращающая вывод параметра типа из аргумента в определённой позиции.
function createState<T>(initial: T, fallback: NoInfer<T>): T {
  return initial ?? fallback;
}

Быстрая проверка

Что добавляет `T extends { length: number }` к T внутри обобщённой функции?

Итоги

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

Часто задаваемые вопросы

Урок «Ограничения обобщений: сужение параметров типов» бесплатный?

Да — полный текст урока «Ограничения обобщений: сужение параметров типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ограничения обобщений: сужение параметров типов»?

Используйте extends, чтобы обеспечить выполнение требований к структуре обобщений Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

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

Сколько времени занимает урок «Ограничения обобщений: сужение параметров типов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. keyof и типы индексированного доступа
  2. Ограничения обобщений: сужение параметров типов
  3. Условные типы: T extends U ? X : Y
  4. Распределительные условные типы
← Назад к TypeScript Academy