TypeScript: گرفتن نام عضو یک enum ثابت به صورت رشته؟


فرض کنید من این تعریف enum ثابت را دارم:

const enum Snack {
    Apple = 0,
    Banana = 1,
    Orange = 2,
    Other = 3
}

در کد تایپاسکریپت من، آیا میتوانم مقدار رشتهای یکی از اعضا را دریافت کنم؟

برای مثال در سی شارپ، nameof(Snack.Orange) خواهد بود. (من می دانم که nameof توسط TypeScript پشتیبانی نمی شود و می دانم که چگونه ممکن است برای enum های غیر ثابت کار کند.)

پاسخ شماره ۱

بهcطور پیشcفرض، const enums در زمان کامپایل بهcطور کامل حذف میcشوند، بنابراین هیچ شی زمان اجرا وجود ندارد که نشانcدهنده enum باشد. میcتوانید از preserveConstEnums برای ایجاد یک شیء enum استفاده کنید. مشکل این است که کامپایلر هنوز اجازه دسترسی به شی enum را نمی دهد، بنابراین باید از یک روش جایگزین برای دسترسی به enum استفاده کنید.

با روشن بودن preserveConstEnums، میتوانیم انوم را در یک namespace قرار دهیم:

namespace enums {
    export const enum Snack {
        Apple = 0,
        Banana = 1,
        Orange = 2,
        Other = 3
    }
}
let enumName = (enums as any).Snack[enums.Snack.Apple];

یا اگر enum داخل یک ماژول باشد:

export const enum Snack {
    Apple = 0,
    Banana = 1,
    Orange = 2,
    Other = 3
}

let enumName = (exports as any).Snack[Snack.Apple];

اگر نمیخواهید از این پرچم استفاده کنید، میتوانید یک شیء ایجاد کنید که طبق تعریف آن باید شامل همه اعضای این شمارش باشد و میتوانید این شیء را برای نام جستجو کنید. با توجه به اینکه اگر چیزی به این شمارش اضافه یا از آن حذف کنید، در زمان کامپایل روی این شیء خطا دریافت خواهید کرد، این ممکن است یک راهحل قابل استفاده باشد:

let SnackNames : { [P in keyof typeof Snack]: { Name: P, Value: typeof Snack[P] } } = {
    Apple : { Value: Snack.Apple, Name: "Apple" },
    Banana : { Value: Snack.Banana, Name: "Banana" },
    Orange : { Value: Snack.Orange, Name: "Orange" },
    Other : { Value: Snack.Other, Name: "Other" },
}