программирование,

Generic тип данных

Jan 29, 2023 · 7 мин. на прочтение
Generic тип данных
Поделиться

Я долгое время не понимал, что такое Generic, для чего он нужен и как его использовать. А теперь я не понимаю, что там можно было не понимать.

Допустим мы создаём тип employee. У нас будет несколько полей: name типа string, age типа number и поле id, которое может принимать как тексовые значения, так и цифровые.

Вот один из вариантов написания такого типа

type emploee = {
  id: string | number
  name: string
  age: number
}

Второй вариант - это использовать generic тип и тогда мы можем сделать такую запись:

type emploee<T> = {
  id: T
  name: string
  age: number
}

Она более короткая. Особенно в тех случаях, когда у нас может быть не только string и number, но ещё и boolean и ещё какие-то типы. Чтобы их все не перечилсять, мы просто используем generic. В этом случае мы сможем определить тип поля id при объявлении переменной и присвоении ей типа emploee.

const user: emploee<number> = {
  id: 1,
  name: 'Vlad',
  age: 25,
}

В примере выше, тип type emploee<T>может принимать любой тип. Не только number или string. Но и null, undefined, boolean и так далее. Чтобы ограничить возможные варианты, мы можем использовать такую запись emploee<extends string | number>. В этом случае мы сможем присвоить полю id только string или number.

Ради прикола, я попросил chatGPT объяснить, что такое Generic простыми словами и написать статью для блога. Привожу её как есть. Нижеследующий текст - это просто Just For Fun. Моё первое знакомство с новыми технологиями.

Статья о Generic от chatGPT

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

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

function sum(a, b) {
  return a + b;
}

console.log(sum(1, 2)); // 3
console.log(sum('Hello', ' World')); // 'Hello World'

Но если мы хотим использовать эту функцию для сложения только чисел, то в данном случае второй вызов функции вернет не ожидаемый результат, сложив строки. С использованием Generics, мы можем явно указать типы данных, которые мы ожидаем получить в качестве параметров:

function sum<T>(a: T, b: T): T {
  return a + b;
}

console.log(sum<number>(1, 2)); // 3
console.log
(sum<string>('Hello', ' World')); // 'Hello World'

Как видно из примера, мы используем угловые скобки <> для обозначения типа Generics и задаем его имя (в данном случае T). Затем мы используем T в качестве типа данных для наших параметров и возвращаемого значения. При вызове функции мы можем явно указать тип данных, который мы ожидаем получить, используя то же имя (number или string в данном примере).

Generics также могут быть использованы для классов и интерфейсов. Например, мы можем создать класс “Queue”, который может быть использован для хранения очереди элементов любого типа:

class Queue<T> {
  private items: T[] = [];

  enqueue(item: T) {
    this.items.push(item);
  }

  dequeue(): T | undefined {
    return this.items.shift();
  }
}

const numberQueue = new Queue<number>();
numberQueue.enqueue(1);
numberQueue.enqueue(2);
console.log(numberQueue.dequeue()); // 1
console.log(numberQueue.dequeue()); // 2

const stringQueue = new Queue<string>();
stringQueue.enqueue('Hello');
stringQueue.enqueue('World');
console.log(stringQueue.dequeue()); // 'Hello'
console.log(stringQueue.dequeue()); // 'World'

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

Некоторые другие примеры использования Generics в JavaScript:

  • Создание функции для сортировки массивов различных типов (чисел, строк, объектов)
  • Создание функции для фильтрации массивов по различным критериям
  • Создание класса “Dictionary”, который может хранить пары ключ-значение любого типа

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

Ниже приведен простой пример создания функции сортировки с использованием Generics:

function sortArray<T>(arr: T[]) {
    return arr.sort();
}

const numbers = [4, 1, 3, 2];
const sortedNumbers = sortArray(numbers);
console.log(sortedNumbers); // [1, 2, 3, 4]

const strings = ['d', 'c', 'b', 'a'];
const sortedStrings = sortArray(strings);
console.log(sortedStrings); // ['a', 'b', 'c', 'd']

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

В заключении, Generics - это мощный инструмент для разработки в JavaScript, который может значительно упростить и улучшить ваш код. Используйте их, когда вам нужно написать функцию, которая может работать с различными типами данных. Например, создание функции для клонирования объектов, которая может работать с объектами различных типов, или создание функции сортировки, которая может работать с массивами различных типов.

Однако, необходимо иметь в виду, что Generics также могут усложнять код и увеличивать его сложность, если их использование необоснованно. Поэтому, перед их использованием, рекомендуется хорошо обдумать и понять, насколько они нужны в конкретной ситуации. В общем, Generics - это мощный инструмент для разработки в JavaScript, который может значительно упростить и улучшить ваш код, но нужно использовать их с умом.

Заходите в группу Telegram
Если есть вопросы или хотите пообщаться, то заходите в мою группу Telegram.