Изучение возможностей дженериков TypeScript: подробное руководство

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

  1. Базовые дженерики.
    Простейшее использование дженериков предполагает создание функции или класса, которые могут работать с разными типами. Например:
function identity<T>(arg: T): T {
  return arg;
}
let result = identity<string>("Hello, World!");
console.log(result); // Output: Hello, World!
  1. Вывод типа:
    TypeScript часто может вывести аргумент типа на основе входных данных, устраняя необходимость явно указывать его. Например:
function identity<T>(arg: T): T {
  return arg;
}
let result = identity("Hello, World!"); // TypeScript infers the type as string
console.log(result); // Output: Hello, World!
  1. Общие массивы:
    Мы можем создавать универсальные массивы, которые работают с любым типом:
function printArray<T>(arr: T[]): void {
  arr.forEach((item) => {
    console.log(item);
  });
}
printArray([1, 2, 3]); // Output: 1, 2, 3
printArray(["a", "b", "c"]); // Output: a, b, c
  1. Ограничения типов.
    Обобщенные типы можно ограничить определенными типами или интерфейсами с помощью ключевого слова extends:
interface Printable {
  print(): void;
}
function printItem<T extends Printable>(item: T): void {
  item.print();
}
class Book implements Printable {
  print() {
    console.log("Book printed.");
  }
}
class Magazine implements Printable {
  print() {
    console.log("Magazine printed.");
  }
}
printItem(new Book()); // Output: Book printed.
printItem(new Magazine()); // Output: Magazine printed.
  1. Общие служебные функции:
    Мы можем создавать служебные функции, которые работают с универсальными типами:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}
let obj = { name: "John", age: 30 };
let name = getProperty(obj, "name"); // Type inferred as string
let age = getProperty(obj, "age"); // Type inferred as number
console.log(name); // Output: John
console.log(age); // Output: 30

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