UNPKG

@zerochae/ts-enum

Version:

A TypeScript Enum library inspired by Java's Enum.

48 lines (47 loc) 1.62 kB
import Enum from "./Enum"; /** * Enum 클래스의 `static` 필드에서 Enum 인스턴스만 추출하여 객체로 반환 * @param EnumClass - `Enum`을 상속하는 클래스 * @returns Enum 인스턴스를 포함하는 객체 */ function getEnumInstance(EnumClass) { const enumInstances = {}; for (const key of Object.keys(EnumClass)) { if (["values", "valueOf", "prototype"].includes(String(key))) continue; const enumClassTyped = EnumClass; if (enumClassTyped[key] instanceof Enum) { enumInstances[key] = enumClassTyped[key]; } } return Object.assign({}, enumInstances); } /** * Enum 객체에 동적으로 메서드를 정의하는 함수 * @param enumObject - 대상 Enum 객체 * @param methodName - 추가할 메서드 이름 * @param method - 메서드 구현 */ function defineEnumMethod(enumObject, methodName, method) { Object.defineProperty(enumObject, methodName, { value: method, enumerable: false, configurable: false, writable: false, }); } /** * Enum 클래스를 기반으로 Enum 객체를 생성하는 함수 * @param EnumClass - `Enum`을 상속하는 클래스 * @returns Enum 인스턴스를 포함하는 객체 */ export function createEnum(EnumClass) { const enumInstance = getEnumInstance(EnumClass); defineEnumMethod(enumInstance, "values", function () { return EnumClass.values(); }); defineEnumMethod(enumInstance, "valueOf", function (value) { return EnumClass.valueOf(value); }); return Object.freeze(enumInstance); }