TypeScript · Урок 43

Продвинутый 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 }

Утилитарные типы из коробки

async function loadPost(id: number) { /* … */ }
type Post = ReturnType<typeof loadPost>; // Promise<…>

type PublicUser = Omit<User, "password">;
💡
unknown вместо any для внешних данных: компилятор заставит проверить тип перед использованием — и ошибки «undefined.title» ловятся на этапе написания кода, а не в рантайме.
ℹ️
Долбитесь в дженерики через реальные кейсы: типы ответов API, пропсов компонентов, обработчиков событий. Абстрактные примеры быстро забываются — пласты кода с типами — нет.