Как мне преобразовать Enum в постоянный класс, подобный этому, в Typescript? В настоящее время используется React Typescript с функциональными компонентами. Этот вопрос немного отличается: перечисление TypeScript в массив объектов
export enum ProductStatus {
Draft = 1,
Review = 2,
Approved = 3,
Rejected = 4,
Billed = 5,
Collected = 6,
Unpayable = 7,
WorkInProgress = 8,
ReadyToReview = 9,
NeedsRevision = 10,
Failed = 11,
}
export const ProductStatus = {
Draft: 1,
Review: 2,
Approved: 3,
Rejected: 4,
Billed: 5,
Collected: 6,
Unpayable: 7,
WorkInProgress: 8,
ReadyToReview: 9,
NeedsRevision: 10,
Failed: 11,
};
Мы можем использовать Object.values
, чтобы получить значения из enum
и преобразовать их в объект, используя reduce
.
const ProductStatusObject = Object.values(ProductStatus)
.filter((v): v is keyof typeof ProductStatus => typeof v !== "number")
.reduce((p, c) => {
p[c] = ProductStatus[c]
return p
}, {} as Record<keyof typeof ProductStatus, number>)
ProductStatusObject
// ^? Record<"Draft" | "Review" | "Approved" | ..., number>
Как вы, возможно, знаете, перечисления содержат отображение в обоих направлениях. Нам нужно отфильтровать значения, которые не относятся к типу string
, чтобы получить только ключи enum
. Обратному вызову filter
также нужен предикат типа, чтобы указать TypeScript, что результирующий массив содержит только значения типа keyof typeof ProductStatus
.
Метод reduce
берет элементы массива и назначает их в качестве ключей к объекту, используя соответствующее значение перечисления. Я набрал объект как Record<keyof typeof ProductStatus, number>
, чтобы получить полезный тип возвращаемого значения.
console.log(ProductStatusObject)
/*
{
"Draft": 1,
"Review": 2,
"Approved": 3,
"Rejected": 4,
"Billed": 5,
"Collected": 6,
"Unpayable": 7,
"WorkInProgress": 8,
"ReadyToReview": 9,
"NeedsRevision": 10,
"Failed": 11
}
*/
прокручивайте клавиши и используйте функцию reduce
const newConst = React.useMemo(() => {
return Object.keys(ProductStatus).reduce((acc, key) => {
if (isNaN(Number(key))) {
acc[key] = ProductStatus[key];
}
return acc;
}, {});
}, []);
console.log(newConst );
Или просто
Object.fromEntries
сObject.entries
и фильтрацией по номерам: tsplay.dev/ND2b1W