← Назад к вопросам

Что такое Generics?

2.2 Middle🔥 201 комментариев
#TypeScript#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Generics?

Generics (обобщённые типы) — это способ написать функции, классы и интерфейсы, которые работают с разными типами, но сохраняют type safety.

Базовый пример:

// БЕЗ Generics (теряем type safety)
function getFirstElement(arr: any[]): any {
  return arr[0];
}

const result = getFirstElement([1, 2, 3]);
const type = result.toUpperCase(); // ERROR! number doesn't have toUpperCase()

// С Generics (сохраняем type safety)
function getFirstElement<T>(arr: T[]): T {
  return arr[0];
}

const result = getFirstElement([1, 2, 3]); // result: number
const type = result.toUpperCase(); // ERROR на compile-time!

Как это работает:

<T> — это type parameter, он "запомнит" какой тип передали. Если передали number[], T будет number. Если string[], T будет string.

Примеры в реальном коде:

1. Функция с Generics

function identity<T>(value: T): T {
  return value;
}

identity<number>(42);    // OK
identity<string>("hi");  // OK
identity<string>(42);    // ERROR!

2. Интерфейс с Generics

interface Box<T> {
  value: T;
}

const numberBox: Box<number> = { value: 42 };
const stringBox: Box<string> = { value: "hi" };

3. Класс с Generics

class Repository<T> {
  private items: T[] = [];
  
  add(item: T) {
    this.items.push(item);
  }
  
  getAll(): T[] {
    return this.items;
  }
}

const userRepo = new Repository<User>();
userRepo.add(newUser); // OK
userRepo.add("string"); // ERROR!

4. Constraints (ограничения)

function merge<T extends object>(a: T, b: T): T {
  return { ...a, ...b };
}

merge({x: 1}, {y: 2});    // OK
merge("string", 123);     // ERROR! string не extends object

Практическое применение:

// API response wrapper
type ApiResponse<T> = {
  success: boolean;
  data?: T;
  error?: string;
};

const userResponse: ApiResponse<User> = {
  success: true,
  data: {id: 1, name: "John"}
};

const postsResponse: ApiResponse<Post[]> = {
  success: true,
  data: [{id: 1, title: "Hello"}]
};

Когда используется:

  • Collections (Array<T>, Set<T>, Map<K, V>)
  • API responses
  • Database queries
  • Utility functions

Совет:

Generics — это мощный инструмент для переиспользуемого, type-safe кода. Это особенно important в TypeScript где type safety — главное преимущество.

Что такое Generics? | PrepBro