● enum to Union
enum StringEnum {
Small = 'S',
Medium = 'M',
Large = 'L',
}
// 👇️ type ValuesUnion = "S" | "M" | "L"
type ValuesUnion = `${StringEnum}`;
// 👇️ type KeysUnion = "Small" | "Medium" | "Large"
type KeysUnion = keyof typeof StringEnum;
● get Enum from value
const getKeyFromValue = (
enumObj: {},
value: string | number,
): string | undefined =>
(Object.entries(enumObj).find(
(e) => isNaN(Number(e[0])) && e[1] === value,
) ?? [undefined])[0];
const getEnumFromValue = <T extends Record<string, string | number>>(
enumObj: T,
value: string | number,
) => {
const key: keyof T | undefined = getKeyFromValue(enumObj, value);
if (!key) return null;
return enumObj[key] || null;
};
enum DayWeek2{
SAN="日曜日",
MON="月曜日",
TUE="火曜日",
WEN="水曜日",
THU="木曜日",
FRI="金曜日",
SAT="土曜日",
}
type Maybe<T> = T | null;
const check_1:DayWeek2 = DayWeek2.SAT; // ✅ 宣言OK
const check_2:DayWeek2 = DayWeek2['SAT']; // ✅ 宣言OK
const check_3:DayWeek2 = "土曜日"; // ❌ 宣言NG
const check_:Maybe<DayWeek2> = getEnumFromValue(DayWeek2,"土曜日"); // ✅ 宣言OK
const check_4a:Maybe<DayWeek2> = getEnumFromValue(DayWeek2, "土曜日"); // ✅ 宣言OK
console.log( check_4a ); // 土曜日
const check_4b:Maybe<DayWeek2> = getEnumFromValue(DayWeek2, "土曜日hoge"); // ✅ 宣言OK
console.log( check_4b ); // null