enum

● 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

No.2360
06/06 12:51

edit