import { CmdAlias, CmdExecutor, CmdOption } from '../cmd/interface';
type Extend<BASE extends {}, N extends string, D> = {
    [P in N | keyof BASE]?: (P extends keyof BASE ? BASE[P] : unknown) & (P extends N ? D : unknown);
};
type ExtractType<T extends string> = T extends 'string' ? string : T extends 'boolean' ? boolean : T extends 'number' ? number : any;
type Nullable<T> = T | null;
type ExtractNullSafeType<T extends string> = T extends `${infer Type}?` ? Nullable<ExtractType<Type>> : ExtractType<T>;
type OptionType<T extends string> = T extends `${infer L}:${infer R}` ? ExtractNullSafeType<R> : unknown;
export declare class CommandBuilder<CHANNEL, OPT extends {} = {}> {
    private name;
    private description;
    private options;
    private aliases;
    addOption<N extends string, D extends string>(name: N, description: D): CommandBuilder<CHANNEL, Extend<OPT, N, OptionType<D>>>;
    addAlias(alias: string, option?: object): this;
    setName<T extends string>(name: T): this;
    setDescription(description: string): this;
    setExecutor(executor: CmdExecutor<CHANNEL, OPT>): {
        name: string;
        description: string;
        aliases: CmdAlias[];
        options: CmdOption[];
        callback: CmdExecutor<CHANNEL, OPT>;
        children: any[];
    };
}
export {};
