import { Id } from './Id';
import { List } from './List';
import { Validatable } from './Validatable';
import { JsonValue } from './Json';
import { Get } from './Get';
import { TypeGuard } from './TypeGuard';
export type EnumConstructor<E = unknown> = {
    all<E extends Enum>(): List<E>;
    byIds<E extends Enum>(ids: Id[]): List<E>;
    byId<E extends Enum>(id: Id, alt?: Get<E, unknown>): E;
    isEnum: boolean;
};
export declare const isEnumConstructor: <E = unknown>(c: unknown) => c is EnumConstructor<E>;
export declare abstract class Enum implements Validatable {
    readonly name: string;
    readonly id: Id;
    readonly code: string;
    static isEnum: boolean;
    protected constructor(name: string, id?: Id, code?: string);
    get isValid(): boolean;
    static all<E extends Enum>(): List<E>;
    static filter<E extends Enum>(p: (value: E, index: number, array: E[]) => unknown, params?: unknown): List<E>;
    static first<E extends Enum>(p?: (value: E, index: number, array: E[]) => unknown, params?: unknown): E;
    static byIds<E extends Enum>(ids?: Id[]): List<E>;
    static byId<E extends Enum>(id: Id, alt?: Get<E, unknown>): E;
    protected static allTuple<E extends Enum>(): Record<Id, E>;
    equals<E extends Enum>(other: E | Id): other is E;
    isIn<E extends Enum>(...items: E[] | Id[]): boolean;
    toJSON(): JsonValue;
    toString(): string;
}
export declare const isEnum: TypeGuard<Enum>;
