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