Как правильно реализовать дженерик?

Дженерики в TypeScript позволяют создавать обобщенные типы, которые могут быть параметризованы другими типами. Это позволяет создавать более гибкий и повторно используемый код.

Для правильной реализации дженериков в TypeScript, вам нужно сначала определить параметры типов, которые будут использованы в определении типа или функции. Вы можете использовать любые идентификаторы в качестве параметров типов, но обычно используются однобуквенные идентификаторы, такие как T, U, V и т.д.

Примеры:

1. Дженерик-тип:

type MyGeneric<T> = {
  value: T;
  isValid: boolean;
};

В этом примере MyGeneric - это дженерик-тип, который содержит поле value типа T и поле isValid типа boolean. Вы можете использовать этот дженерик-тип в разных местах вашего кода, указывая конкретные типы для параметра T:

const myValue: MyGeneric<number> = {
  value: 10,
  isValid: true
};

const myString: MyGeneric<string> = {
  value: 'Hello',
  isValid: false
};

2. Дженерик-функция:

function reverseArray<T>(array: T[]): T[] {
  return array.reverse();
}

В этом примере reverseArray - это дженерик-функция, которая принимает массив array типа T и возвращает массив того же типа. Вы можете вызвать эту функцию с различными типами:

const numbers = [1, 2, 3, 4, 5];
const reversedNumbers = reverseArray(numbers); // [5, 4, 3, 2, 1]

const strings = ['apple', 'banana', 'cherry'];
const reversedStrings = reverseArray(strings); // ['cherry', 'banana', 'apple']

3. Ограничение дженерика:

function concatenate<T extends string | number>(a: T, b: T): string {
  return String(a) + String(b);
}

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

const result1 = concatenate('Hello', 'World'); // "HelloWorld"
const result2 = concatenate(10, 20); // "1020"
const result3 = concatenate('Hello', 10); // ОШИБКА: аргументы разных типов

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