import { ASTAliasedTypes, ASTEnum, ASTIntersection, ASTNode, ASTObject, ASTUnion, Zod2X } from "../../core";
import { IZod2TsOpt } from "./options";
export declare class Zod2Ts extends Zod2X<IZod2TsOpt> {
    protected readonly commentKey = "//";
    constructor(opt?: IZod2TsOpt);
    protected runAfter(): void;
    protected runBefore(): void;
    protected addImportFromFile(filename: string, namespace: string): string;
    protected getTypeFromExternalNamespace(namespace: string, typeName: string): string;
    protected addExtendedType(name: string, parentNamespace: string, aliasOf: string, opt?: {
        type?: "union" | "d-union" | "alias";
        isInternal?: boolean;
        templates?: string;
        declaredTemplates?: string;
    }): void;
    protected getGenericTemplatesTranslation(data: ASTNode): string | undefined;
    /**
     * Emits an alias/extension declaration early when a node references another layered type.
     * It preserves concrete template translations and falls back to declared templates (e.g. <T>)
     * for aliases of generic templates.
     */
    protected checkExtendedTypeInclusion(data: ASTNode, type?: "alias" | "union" | "d-union"): boolean;
    protected getAnyType: () => string;
    protected getBooleanType: () => string;
    protected getDateType: () => string;
    /** Ex: Set<TypeA> */
    protected getSetType: (itemType: string) => string;
    protected getStringType: () => string;
    /** Ex: [TypeA, TypeB] */
    protected getTupleType: (itemsType: string[]) => string;
    /** Ex: TypeA | TypeB */
    protected getUnionType: (itemsType: string[]) => string;
    /** Ex: TypeA & TypeB */
    protected getIntersectionType: (itemsType: string[]) => string;
    protected getNumberType: () => string;
    /** Ex: Array<Array<TypeA[]>> */
    protected getArrayType(arrayType: string, arrayDeep: number): string;
    protected getLiteralStringType(value: string | number, parentEnumNameKey?: [string, string]): string | number;
    /** Ex: Map<TypeA, TypeB> */
    protected getMapType(keyType: string, valueType: string): string;
    /** Ex: Record<TypeA, TypeB> */
    protected getRecordType(keyType: string, valueType: string): string;
    protected transpileAliasedType(data: ASTAliasedTypes): void;
    /** Ex:
     *  enum {
     *      ItemKey1: 0,            // case of nativeEnum
     *      ItemKey2: "ItemValue2"  // case of Enum
     *  }
     */
    protected transpileEnum(data: ASTEnum): void;
    /** Ex:
     * // Interface output
     * // Class output if non-object intersection
     * type TypeC = TypeA & TypeB
     *
     * // Class output all-object intersection
     * class TypeC {
     *     ...attributesTypeA,
     *     ...attributesTypeB
     *
     *     constructor(data: TypeC) {
     *         ...attributesAssignment
     *     }
     * }
     * */
    protected transpileIntersection(data: ASTIntersection): void;
    protected transpileStruct(data: ASTObject): void;
    /** Ex:
     * // Interface output
     * // Class output for Discriminated Union or non-objects union
     * type TypeC = TypeA | TypeB
     *
     * // Class output for all-object Union
     * class TypeC {
     *     ...attributesTypeA,
     *     ...attributesTypeB
     *
     *     constructor(data: TypeC) {
     *         ...attributesAssignment
     *     }
     * }
     * */
    protected transpileUnion(data: ASTUnion): void;
    /** Ex:
     *  interface MyStruct {
     *      att1: TypeA;
     *      att2?: TypeB;
     *  }
     * */
    private _transpileStructuAsInterface;
    /** Ex:
     *  class MyStruct {
     *      att1: TypeA;
     *      att2?: TypeB;
     *
     *      constructor(data: MyStruct) {
     *          this.att1 = data.att1;
     *          this.att2 = data.att2;
     *      }
     *  }
     * */
    private _transpileStructAsClass;
    /** For Interface/Class attributes.
     *  Ex: attribute1?: TypeA | null */
    private _transpileMember;
}
