Динамическое свойство у интерфейса в зависимости от значения соседнего поля?

В TypeScript можно определить динамическое свойство у интерфейса в зависимости от значения соседнего поля путем использования условных типов.

Предположим, у нас есть интерфейс User с двумя полями: isAdmin и permissions. Мы хотим, чтобы тип permissions был динамическим в зависимости от значения поля isAdmin. Если isAdmin равно true, то тип permissions должен иметь значения "read" и "write", а если isAdmin равно false, то тип permissions должен иметь только значение "read".

Мы можем определить интерфейс User следующим образом:

interface AdminUser {
  isAdmin: true;
  permissions: ("read" | "write")[];
}

interface RegularUser {
  isAdmin: false;
  permissions: "read";
}

type User = AdminUser | RegularUser;

Теперь, если мы определяем переменную типа User с полем isAdmin равным true, TypeScript будет обязывать нас определять поле permissions с типом ("read" | "write")[], а если isAdmin равно false, поле permissions автоматически будет иметь тип "read".

Например:

const admin: User = {
  isAdmin: true,
  permissions: ["read", "write"]
};

const regular: User = {
  isAdmin: false,
  permissions: "read"
};

Обратите внимание, что в интерфейсе User мы используем объединение типов (|) и условный тип (type) для определения динамического типа свойства permissions. Это позволяет TypeScript определять тип permissions в зависимости от значения isAdmin.

Таким образом, мы можем использовать условные типы в TypeScript для определения динамического свойства у интерфейса в зависимости от значения соседнего поля.