Общие типы (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
для своего типа данных.
Общие типы могут использоваться для создания универсальных компонентов, которые могут работать с различными типами данных. Они позволяют создавать более гибкий и масштабируемый код, который может быть использован в различных контекстах.