Как типизировать массив объектов, чтобы поля содержали суммарно ВСЕ значения enum?

Для типизации массива объектов, чтобы поля содержали суммарно все значения enum, в TypeScript можно использовать TypeScript Utility Types, такие как keyof и Record.

Допустим, у вас есть enum:

enum Status {
  Active = 'Active',
  Inactive = 'Inactive',
  Pending = 'Pending',
}

И у вас есть объекты с такими значениями:

const objects = [
  { name: 'John', status: Status.Active },
  { name: 'Alice', status: Status.Inactive },
  { name: 'Bob', status: Status.Pending },
];

Теперь, чтобы типизировать массив объектов таким образом, чтобы поля status содержали все значения из enum Status, можно представить это как пересечение типов:

type ObjectWithStatus<T> = T & { status: Status };

type Objects = Array<ObjectWithStatus<{ name: string }>>;

const objects: Objects = [
  { name: 'John', status: Status.Active },
  { name: 'Alice', status: Status.Inactive },
  { name: 'Bob', status: Status.Pending },
];

В данном случае мы создаем тип ObjectWithStatus<T>, который принимает объект произвольного типа T и добавляет к нему поле status с типом Status. Затем мы создаем тип Objects, который представляет массив объектов, тип каждого из которых соответствует типу ObjectWithStatus<{ name: string }>, то есть объект с полем name типа string и полем status типа Status.

Теперь переменная objects будет правильно типизирована, гарантируя, что поля status объектов содержат только значения из enum Status.