import { ClassType } from "../base/type";
export declare type ModelHelperInitObjectCacheType = [
    Map<string, SrcParams> | undefined,
    Record<string, any>,
    string[] | undefined
];
/**
 * 数据模型转化
 * @author yangyxd  2021.03.16
 */
export declare class ModelHelper {
    static _maps: Map<string, Map<string, SrcParams>>;
    static _initedClassMap: Record<string, boolean>;
    /**
     * 将输入的一个any对象转化为指定的对象
     * @param data 输入对象
     * @param ouputClass 要输入的类型
     * @param skeepNull 跳过空字段（输入数据为空时，保留现在数据）
     * @param mergeAllField 合并所有字段
     * @param convSubFieldName 是否转变子对象的名称
     * @returns
     */
    static toModel<T>(data: any | undefined, ouputClass: ClassType<T>, skeepNull?: boolean, mergeAllField?: boolean, convSubFieldName?: boolean): T;
    /**
     * 将输入的一个any对象数组转化为指定的对象数组
     * @param data 输入对象
     * @param ouputClass 要输入的类型
     * @param convert 转换器
     * @param skeepNull 跳过空字段（输入数据为空时，保留现在数据）
     * @param mergeAllField 合并所有字段
     * @param convSubFieldName 是否转变子对象的名称
     * @returns
     */
    static toArrayModel<T>(data: any[] | undefined, ouputClass: ClassType<T>, convert?: SrcConverterBase, skeepNull?: boolean, mergeAllField?: boolean, convSubFieldName?: boolean): T[];
    /**
     * 从源数据中初始化数据，对两者进行合并，现有数据优先
     * @param sourceData 源数据
     * @param data 要初始化的数据
     * @param mergeAllField 是否合并来源数据的所有字段，包括在T中不存在的字段
     * @param convSubFieldName 是否转变子对象的字段名称
     * @param convFieldName 是否转换字段名称
     */
    static initModel<T>(sourceData: any | undefined, data: T, mergeAllField?: boolean, convSubFieldName?: boolean, convFieldName?: boolean, cacheInfo?: ModelHelperInitObjectCacheType, doInitCacheInfo?: (keys: string[]) => ModelHelperInitObjectCacheType): void;
    /**
     * 合并所有字段
     * @param sourceData 源数据
     * @param data 输出数据
     * @param keys 字段列表
     * @param convFieldName 是否转换字段名称（坨峰转换），默认 `true`
     */
    static mergeAllFields(sourceData: any | undefined, data: any, keys: string[], convFieldName?: boolean): void;
    static initObjectRegKeys(_regKeys: Map<string, SrcParams> | undefined, result: any | Record<string, any>, keys: string[], skeepNull?: boolean): void;
    static initObjectCacheInfo(result: any | Record<string, any>, item: any | Record<string, any>, keys: string[], useKeys?: boolean): ModelHelperInitObjectCacheType;
    private static initObject;
    private static convObjectFieldName;
    private static getChildrenValue;
    static getClassParams(className: string, fieldName: string): SrcParams | undefined;
    /** 获取对象的所有 keys ，包括 src 注解部分 */
    static getObjectKeys(obj: any | Record<string, any>): string[];
    static getClassMap(className: string, object?: any | undefined): Map<string, SrcParams> | undefined;
    /** 将有 @src 装饰器的字段合并 */
    static mergeClassMapField(className: string, doSetValue?: (srcKey: string, destKey: string, src: SrcParams) => void): void;
}
export declare class SrcParams {
    /** 字段名称 */
    name: string;
    /** 属性名称 */
    propertyName: string;
    /** 是否为数组 */
    array: boolean;
    /** 构造器 */
    classType?: ClassType<any>;
    /** 转换器 */
    convert?: SrcConverterBase;
    /** 执行转换器，如果返回 undefined ，则会忽略字段, 不进行处理 */
    executeConvert(owner: any | undefined, value: any | undefined): any | undefined;
}
/**
 * src 注解，用于标识来源数据的信息
 * @param name  源数据中的字段名称, 为空则使用本地字段名
 * @param classType  目标对象类型（如果转换后需要是个对象时使用）
 * @param array 是否是数组
 * @param convert 转换器类型
 * @param ...args 转换器参数, 不同的转换器，参数不同
 * @returns
 */
export declare function src(name?: string | undefined, classType?: ClassType<any>, array?: boolean, convert?: ClassType<SrcConverterBase>, ...args: any | undefined): any;
/** 来源数据转换器基类 */
export declare abstract class SrcConverterBase {
    data: any;
    /** 如果返回 undefined 则忽略此数据 */
    abstract execute(value: any | undefined): any | undefined;
}
/** 直接排除掉某个字段的转换器 */
export declare class ExcludeFieldSrcConverter extends SrcConverterBase {
    execute(v: any | undefined): any | undefined;
}
/** 数据筛选转换器, 来源数据指定字段的值与参数值一致时返回来源值，否则返回 undefined */
export declare class EqualValueFilterSrcConverter extends SrcConverterBase {
    field: string;
    value: any;
    /** 数据筛选转换器, 来源数据指定字段的值与参数值一致时返回来源值，否则返回 undefined */
    constructor(field: string, value: any | undefined);
    execute(v: any | undefined): any | undefined;
}
/** 布尔值转换器 */
export declare class BoolValueSrcConverter extends SrcConverterBase {
    /** 条件为true时的值或值列表 */
    trueValue: any;
    constructor(trueValue?: any | undefined);
    execute(v: any | undefined): any | undefined;
}
/** 布尔值计算转换器 */
export declare class BoolCalcSrcConverter extends SrcConverterBase {
    calcCallBack?: (v: any) => boolean;
    constructor(calcCallBack?: (v: any | undefined) => boolean);
    execute(v: any | undefined): any | undefined;
}
/** 数值型转换器 */
export declare class IntSrcConverter extends SrcConverterBase {
    calcCallBack?: (v: any) => number;
    constructor(calcCallBack?: (v: any) => number);
    execute(v: any | undefined): any | undefined;
}
/** 日期型转换器 */
export declare class DateSrcConverter extends SrcConverterBase {
    execute(v: any | undefined): any | undefined;
}
/** JSON字符串转对象 - 转换器 */
export declare class JsonObjectSrcConverter extends SrcConverterBase {
    convSubFieldName: boolean;
    /**
     * @param convSubFieldName 是否转变子对象的字段名称
     */
    constructor(convSubFieldName?: boolean);
    execute(v: any | undefined): any | undefined;
}
/**
 * 子对象转换至父级 - 转换器
 * 注意：
 * 如果目标是数组，则会将数组内容设置到装饰器的字段中
 * 如果目标是对象，则会将对象的内容设置到装饰器所在的类中，而不改变装饰器所有字段本身
 */
export declare class SubObjectConverter extends SrcConverterBase {
    convSubFieldName: boolean;
    convFieldName?: boolean;
    /**
     * @param convSubFieldName 是否转变子对象的字段名称
     */
    constructor(convSubFieldName?: boolean, convFieldName?: boolean);
    execute(v: any | undefined): any | undefined;
}
