📘 TypeScript
Дженерики TypeScript
Обобщённые функции
function wrap(value: T): { value: T } {
return { value };
}
const wrappedNum = wrap(42); // { value: 42 }
const wrappedStr = wrap("привет"); // { value: "привет" }
function zip(a: A[], b: B[]): [A, B][] {
return a.map((item, i) => [item, b[i]]);
}
console.log(zip([1, 2], ["a", "b"])); // [[1,"a"],[2,"b"]]
Обобщённые интерфейсы и классы
interface Repository {
findById(id: number): T | undefined;
save(item: T): void;
getAll(): T[];
}
class Stack {
private items: T[] = [];
push(item: T): void { this.items.push(item); }
pop(): T | undefined { return this.items.pop(); }
peek(): T | undefined { return this.items[this.items.length - 1]; }
get size(): number { return this.items.length; }
}
const stack = new Stack();
stack.push(1); stack.push(2); stack.push(3);
console.log(stack.pop()); // 3
console.log(stack.size); // 2
Ограничения дженериков
interface HasLength {
length: number;
}
function logLength(item: T): void {
console.log(`Длина: ${item.length}`);
}
logLength("привет"); // Длина: 6
logLength([1, 2, 3]); // Длина: 3
// logLength(42); // ❌ Ошибка: у number нет length
Утилитарные типы
interface User {
id: number;
name: string;
email: string;
role: string;
}
// Partial — все свойства необязательны
type PartialUser = Partial;
// Readonly — все свойства только для чтения
type ReadonlyUser = Readonly;
// Pick — выбрать конкретные свойства
type UserPreview = Pick;
// Omit — исключить конкретные свойства
type UserWithoutRole = Omit;
// Record — построить тип-словарь
type Permissions = Record;
const perms: Permissions = { read: true, write: false };