НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
TypeScript. Уроки для початківців

En Es De

TypeScript Основні дженерики (універсали)


Дженерики (універсали) дозволяють створювати 'змінні типу', які можна використовувати для створення класів, функцій і псевдонімів типів, яким не потрібно явно визначати типи, які вони використовують.

Універсальні коди спрощують написання багаторазового коду.


Функції

Універсальні засоби з функціями допомагають створювати більш узагальнені методи, які точніше представляють типи, що використовуються та повертаються.

Приклад

function createPair<S, T>(v1: S, v2: T): [S, T] {
  return [v1, v2];
}
console.log(createPair<string, number>('hello', 42)); // ['hello', 42]
Спробуйте самі »

TypeScript також може визначити тип загального параметра з параметрів функції.


Класи

Дженеріки можна використовувати для створення узагальнених класів, наприклад JS Карти.

Приклад

class NamedValue<T> {
  private _value: T | undefined;

  constructor(private name: string) {}

  public setValue(value: T) {
    this._value = value;
  }

  public getValue(): T | undefined {
    return this._value;
  }

  public toString(): string {
    return `${this.name}: ${this._value}`;
  }
}

let value = new NamedValue<number>('myNumber');
value.setValue(10);
console.log(value.toString()); // myNumber: 10
Спробуйте самі »

TypeScript також може визначити тип загального параметра, якщо він використовується в параметрі конструктора.


Введіть псевдоніми

Узагальнення в псевдонімах типів дозволяють створювати типи, які можна використовувати повторно.

Приклад

type Wrapped<T> = { value: T };

const wrappedValue: Wrapped<number> = { value: 10 };

Це також працює з інтерфейсами з таким синтаксисом: interface Wrapped<T> {


Значення за замовчуванням

Дженерикам можна призначити значення за замовчуванням, які застосовуються, якщо інше значення не вказано чи виведено.

Приклад

class NamedValue<T = string> {
  private _value: T | undefined;

  constructor(private name: string) {}

  public setValue(value: T) {
    this._value = value;
  }

  public getValue(): T | undefined {
    return this._value;
  }

  public toString(): string {
    return `${this.name}: ${this._value}`;
  }
}

let value = new NamedValue('myNumber');
value.setValue('myValue');
console.log(value.toString()); // myNumber: myValue

Розширення

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

Приклад

function createLoggedPair<S extends string | number, T extends string | number>(v1: S, v2: T): [S, T] {
  console.log(`creating pair: v1='${v1}', v2='${v2}'`);
  return [v1, v2];
}

Це можна поєднати зі значенням за замовчуванням.


TypeScript Вправи

Перевірте себе за допомогою вправ

Вправа:

Заповніть дженерік:

function createPair, (x: typeX, y: typeY): [typeX, typeY] {
return [x, y];
}
console.log(createPair<string, number>('Meaning', 42));


Що таке дженерики простою мовою?

Уявіть дженерики як універсальні контейнери, які можна використовувати для зберігання даних будь-якого типу.

Наприклад, уявіть, що у вас є коробка для зберігання яблук. Ця коробка може містити лише яблука. А що, якщо вам потрібна коробка, яка може містити не лише яблука, а й інші фрукти, наприклад банани чи апельсини? Ось тут і з’являються дженерики.

Дженерики в TypeScript дозволяють створювати типи, які можуть працювати з даними будь-якого типу.

Наприклад, ви можете створити функцію, яка може сортувати будь-який масив, незалежно від того, чи містить він числа, рядки чи інші типи даних.

Ось приклад дженерика:

function sort<T>(array: T[]): T[] {
  // ... код сортування ...
  return array;
}

У цьому прикладі sort - це дженерична функція, яка приймає масив array будь-якого типу T і повертає відсортований масив того ж типу.

Ось ще кілька прикладів дженериків:

  • Array<T> - тип, який представляє масив даних типу T.
  • Map<K, V> - тип, який представляє словник, де ключі мають тип K, а значення - тип V.
  • Promise<T> - тип, який представляє обіцянку, яка буде вирішена значенням типу T.

Висновок

Дженерики роблять код TypeScript більш гнучким і багаторазовим. Завдяки дженерикам вам не потрібно писати окремий код для роботи з різними типами даних.

Якщо ви тільки починаєте вивчати TypeScript, не хвилюйтесь, якщо дженерики здаються вам складними. З часом і практикою ви краще зрозумієте, як вони працюють, і зможете використовувати їх у своєму коді.

Докладніше із дженериками ви можете ознайомитись на офіційному сайті TypeScript за посиланням: https://www.typescriptlang.org/docs/handbook/2/generics.html



Коментарі