TypeScript, расширенная версия JavaScript, предоставляет мощные функции, которые расширяют возможности разработки и повышают безопасность типов. Одной из таких функций являются дженерики, которые позволяют нам писать многоразовый типобезопасный код. В этой статье мы рассмотрим различные методы использования дженериков TypeScript, сопровождаемые примерами кода, которые помогут вам использовать этот мощный инструмент в своих проектах.
- Базовые дженерики.
Простейшее использование дженериков предполагает создание функции или класса, которые могут работать с разными типами. Например:
function identity<T>(arg: T): T {
return arg;
}
let result = identity<string>("Hello, World!");
console.log(result); // Output: Hello, World!
- Вывод типа:
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!
- Общие массивы:
Мы можем создавать универсальные массивы, которые работают с любым типом:
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
- Ограничения типов.
Обобщенные типы можно ограничить определенными типами или интерфейсами с помощью ключевого слова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.
- Общие служебные функции:
Мы можем создавать служебные функции, которые работают с универсальными типами:
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 — это мощный инструмент, который может улучшить возможность повторного использования кода, безопасность типов и удобство сопровождения. В этой статье мы рассмотрели различные методы использования дженериков, включая базовое использование, вывод типа, универсальные массивы, ограничения типов и универсальные служебные функции. Используя дженерики, разработчики могут писать более гибкий и надежный код, адаптирующийся к различным типам данных.