Для типизации массива объектов, чтобы поля содержали суммарно все значения 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
.