import type { TDecoratorKey } from "../types"; /** * 类元数据访问层。 * * 改造前,"实例化 target -> for...in 遍历 -> Reflect.getMetadata" * 这套逻辑在 UmByClass / UmByClassEnhance / UmSearchForm / UmSearchFormEnhance / * UmTableForm 里被复制了 8 次,每次细节还都略有出入(有的漏了 hasOwnProperty 判断, * 有的用归一化名查、有的用原始名查),导致同一份配置在不同组件里表现不一致。 * * 这里收口成唯一实现。 */ /** 类实例上的一个成员 */ export interface IClassMember { /** 类上的原始属性名(可能带 `_` 前缀) */ key: string; /** 归一化名称:去掉 `_` 前缀,与后端字段名一致 */ fieldName: string; /** 成员的值 */ value: any; /** 是否为函数成员 */ isMethod: boolean; } /** 带元数据的成员 */ export type IDecoratedMember = IClassMember & { meta: M; }; /** 去掉 `_` 前缀:`_foo` -> `foo` */ export declare const normalizeFieldName: (key: string) => string; /** * 构造实例,用于读取"实例字段"上的装饰器元数据。 * target 为空或不是构造函数时返回原值 / 空对象,避免抛错。 */ export declare const createTargetInstance: (target: any) => any; /** * 收集类实例上的全部成员(含原型链上的方法)。 * * 为什么要扫原型链:当 `useDefineForClassFields = false` 时, * 无初始值的字段(如 `birthday: any;`)不会出现在实例上, * 只靠 `for...in` 会漏掉这些字段对应的列。 */ export declare const collectClassMembers: (target: any) => IClassMember[]; /** * 读取某个成员上的装饰器元数据。 * 先按归一化名查,再按原始名查,兼容两种书写习惯。 */ export declare const getMemberMeta: (target: any, decoratorKey: TDecoratorKey, member: Pick) => M | undefined; /** * 扫描出所有挂载了指定装饰器元数据的成员。 * @param options.methods 是否是方法成员(默认 false,即取普通字段) */ export declare const scanDecoratedMembers: (target: any, decoratorKey: TDecoratorKey, options?: { methods?: boolean; }) => IDecoratedMember[]; /** * 在"接口原始数据"与"表单展示数据"之间做双向字段转换。 * * 约定:类上用 `_field` 存原始值,再通过 getter/setter `field` 暴露格式化后的值 * (金额、日期、字典等)。原实现把这段转换在 UmByClassEnhance 里写了两遍 * (打开弹窗时一遍、提交时一遍),且两遍取的属性名还不一致(一处取 `field`、 * 一处取 `_field`),行为难以预期。这里统一为单一实现: * - `in` :接口原始值 -> 表单展示值(走 getter) * - `out`:表单展示值 -> 接口原始值(走 `_field`) * * @returns 转换后的同一份 data(便于链式调用) */ export declare const transformFields: (target: any, data: any, direction: "in" | "out") => any; /** * 按类型取出某个方法元数据(早退版本,避免每次全量扫描后才 return) */ export declare const findMethodMeta: (target: any, decoratorKey: TDecoratorKey, type: string) => { meta: any; member: IDecoratedMember; } | null;