#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 {// ...}