Продвинутый TypeScript
Базу из урока 26 вы знаете. Теперь — инструменты, которые убирают дублирование типов и дают безопасность на уровне API и компонентов.
Дженерики: один код, много типов
function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {
const out = {} as Pick<T, K>;
for (const k of keys) out[k] = obj[k];
return out;
}
const user = pick({ name: "Аня", age: 24, city: "МСК" }, ["name", "city"]);
// user: уже типизированный объект { name: string; city: string }
Утилитарные типы из коробки
Partial<T>— все поля необязательными (обновление формы частично);Pick<T, K>— оставить только выбранные поля;Omit<T, K>— убрать выбранные поля (например, скрыть password);ReturnType<F>— тип того, что возвращает функция.
async function loadPost(id: number) { /* … */ }
type Post = ReturnType<typeof loadPost>; // Promise<…>
type PublicUser = Omit<User, "password">;
💡
unknown вместо any для внешних данных: компилятор заставит проверить тип перед использованием — и ошибки «undefined.title» ловятся на этапе написания кода, а не в рантайме.ℹ️
Долбитесь в дженерики через реальные кейсы: типы ответов API, пропсов компонентов, обработчиков событий. Абстрактные примеры быстро забываются — пласты кода с типами — нет.