enum-union
Version:
TypeScript library that offers a flexible and declarative way to generate advanced enums and union types, supporting different casing styles, number-based enums, and enums from object types, enhancing type safety in TypeScript projects.
59 lines (58 loc) • 3.48 kB
TypeScript
declare type Indices<N extends number, R extends readonly number[] = []> = R["length"] extends N ? R[number] : Indices<N, [...R, R["length"]]>;
declare type EnumMap<T extends string> = {
_type: "enum";
} & Record<T, T>;
declare type LowercaseEnumMap<T extends string> = {
_type: "lowercase";
} & Record<T, Lowercase<T>>;
declare type UppercaseEnumMap<T extends string> = {
_type: "uppercase";
} & Record<T, Uppercase<T>>;
declare type CapitalizeEnumMap<T extends string> = {
_type: "capitalize";
} & Record<T, Capitalize<T>>;
declare type UncapitalizeEnumMap<T extends string> = {
_type: "uncapitalize";
} & Record<T, Uncapitalize<T>>;
declare type ConfigOptions = "enum" | "lowercase" | "uppercase" | "capitalize" | "uncapitalize";
declare type OmitType<T> = Omit<T, "_type">;
declare type EnumConfiguration<T extends string, U extends string> = U extends "lowercase" ? LowercaseEnumMap<T> : U extends "uppercase" ? UppercaseEnumMap<T> : U extends "capitalize" ? CapitalizeEnumMap<T> : U extends "uncapitalize" ? UncapitalizeEnumMap<T> : EnumMap<T>;
declare type EnumFromStrings<T extends string[], V extends number> = {
_type: V;
} & {
[U in T[number]]: Indices<V>;
};
export declare type Enum<T> = T extends {
_type: infer U;
} ? U extends "lowercase" ? Lowercase<string & T[keyof Omit<T, "_type">]> : U extends "uppercase" ? Uppercase<string & T[keyof Omit<T, "_type">]> : U extends "capitalize" ? Capitalize<string & T[keyof Omit<T, "_type">]> : U extends "uncapitalize" ? Uncapitalize<string & T[keyof Omit<T, "_type">]> : U extends number ? Indices<U> : T[keyof Omit<T, "_type">] : ExtractEnumObjValues<T>;
declare type ExtractEnumObjValues<T> = T extends Record<string, infer U> ? U : never;
export declare function Enum<D extends Record<string, string | number>>(firstOrConfig: D): {
[K in keyof D]: D[K];
};
export declare function Enum<N extends number, T extends string>(firstOrConfig: N, ...items: T[]): [OmitType<EnumFromStrings<T[], N>>, EnumFromStrings<T[], N>];
export declare function Enum<T extends string>(firstOrConfig: "lowercase", ...items: T[]): [
OmitType<EnumConfiguration<T, "lowercase">>,
EnumConfiguration<T, "lowercase">
];
export declare function Enum<T extends string>(firstOrConfig: "uppercase", ...items: T[]): [
OmitType<EnumConfiguration<T, "uppercase">>,
EnumConfiguration<T, "uppercase">
];
export declare function Enum<T extends string>(firstOrConfig: "capitalize", ...items: T[]): [
OmitType<EnumConfiguration<T, "capitalize">>,
EnumConfiguration<T, "capitalize">
];
export declare function Enum<T extends string>(firstOrConfig: "uncapitalize", ...items: T[]): [
OmitType<EnumConfiguration<T, "uncapitalize">>,
EnumConfiguration<T, "uncapitalize">
];
export declare function Enum<T extends string>(firstOrConfig: T, ...items: T[]): [OmitType<EnumConfiguration<T, "enum">>, EnumConfiguration<T, "enum">];
export declare function Enum<N extends number, T extends string>(firstOrConfig: T, ...items: T[]): [
OmitType<EnumConfiguration<T, ConfigOptions>>,
EnumConfiguration<T, ConfigOptions>
];
export declare type ExtractEnumType<T> = Enum<T>;
export declare const makeEnum: typeof Enum;
export declare function enumKeys<T extends ReturnType<typeof Enum>[0]>(enumObj: T): (keyof T)[];
export declare function enumKeyByVal<T extends ReturnType<typeof Enum>[0]>(enumObj: T, val: T[keyof T]): keyof T;
export {};