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

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

Например, мы можем создать функцию identity, которая принимает аргумент и возвращает его же значение, но с помощью общего типа, чтобы она могла работать с любым типом данных:

function identity<T>(arg: T): T {
  return arg;
}
 
let result = identity<string>('Hello, world!');

В этом примере мы определили общий тип T внутри угловых скобок в функции identity. Затем мы использовали этот общий тип для определения типа аргумента функции и типа возвращаемого значения. Функция identity принимает аргумент типа T и возвращает значение того же типа.

Мы вызвали функцию identity с аргументом типа string и явно указали тип общего типа T как string. В результате переменная result имеет тип string.

Общие типы могут использоваться не только для функций, но и для классов, интерфейсов и других конструкций языка.

Например, мы можем определить общий интерфейс Repository, который может работать с различными типами данных:

interface Repository<T> {
  getById(id: number): T;
  save(item: T): void;
}
 
class UserRepository implements Repository<User> {
  getById(id: number): User {
    // ...
  }
  save(user: User): void {
    // ...
  }
}
 
class ProductRepository implements Repository<Product> {
  getById(id: number): Product {
    // ...

В этом примере мы определили интерфейс Repository с общим типом T. Интерфейс Repository содержит два метода: getById, который возвращает элемент типа T по идентификатору, и save, который сохраняет элемент типа T.

Затем мы определили два класса, UserRepository и ProductRepository, которые реализуют интерфейс Repository для типов User и Product соответственно. Каждый класс реализует методы getById и save для своего типа данных.

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


Назад