TGViewer
Node.js Recipes Node.js Recipes @node_recipes · 3.1K subscribers
Post #218 1.81K
Как писать меньше TypeScript интерфейсов?
#typescript

TL;DR Используйте Lookup Types

TypeScript позволяет писать вложенные интерфейсы. Например:

interface User {
id: number;
name: string;
contacts: {
phone: string;
email: string;
address: {
country: string;
city: string;
street: string;
}
}
}

Необходимо создать функцию updateUserContact. Распространённое решение вынести UserСontact как отдельный интерфейс, или еще хуже продублировать его. Новый интерфейс использовать как тип в функции.
Вместо этого следует использовать  Lookup Types. Это выглядит так:
type UserСontacts = User['contacts']
type UserAddress = User['contacts']['address']

Обратите внимание, что всегда используются квадратные скобки и кавычки, а не точка. Такая нотация позволяет делать union внутри квадратных скобок или использовать keyof. В завершение пример близкий к продакшен коду:

function updateUserContact<T extends keyof User["contacts"]>(
user: User,
contactType: T,
contact: User["contacts"][T]
): void {
// ...
}
www.typescriptlang.org Documentation - TypeScript 2.1 TypeScript 2.1 Release Notes
More from @node_recipes
  1. Jan 5, 2026По всьому світу проходять Cursor Meetups, де локальні спільноти діляться досвідом використ…
  2. Jan 5, 2026Думки на вихідних: Full Stack Learning Подивився останнє відео Сергія Немчинського про фул…
  3. Dec 31, 2025Залишаються лічені години 2025-го. І будьмо чесними: сам перехід на 2026-й нічого автомати…
  4. Dec 25, 2025Моє відкриття 2025 року, як доповідача, це Napkin.ai. На малюнку приклад того, як Napkin г…
  5. Dec 23, 2025А ось й ChatGPT додав 2025 review feature. Авжеж в мене half coded Nest.js app, як ще :)
  6. Dec 23, 2025Моє технічне відкриття 2025 року — centrifugal.dev У 2025-му я багато працював із реальним…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →