Files
FunJiaUI_Vue_Package/UmTable/core/meta.d.ts
T
funjia f26bd3f377 feat: 更新为 1.2.0 构建产物(内核重构版)
- 产物替换为 funjiaui.es.js / funjiaui.cjs.js / funjiaui.umd.js
- style.css 更新,新增 index.d.ts 与各组件类型声明目录
- 移除旧产物 um_table.es.js(1.0.0 的 ES 包,历史与 v1.0.0 标签仍可回溯)
- package.json 补齐 module / types / unpkg / jsdelivr / files 字段,
  并将 vue、element-plus、@element-plus/icons-vue 声明为 peerDependencies
- 新增 README 说明产物清单与用法
2026-09-19 01:04:09 +08:00

74 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<M> = 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: <M>(target: any, decoratorKey: TDecoratorKey, member: Pick<IClassMember, "key" | "fieldName">) => M | undefined;
/**
* 扫描出所有挂载了指定装饰器元数据的成员。
* @param options.methods 是否是方法成员(默认 false,即取普通字段)
*/
export declare const scanDecoratedMembers: <M>(target: any, decoratorKey: TDecoratorKey, options?: {
methods?: boolean;
}) => IDecoratedMember<M>[];
/**
* 在"接口原始数据"与"表单展示数据"之间做双向字段转换。
*
* 约定:类上用 `_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<any>;
} | null;