- 产物替换为 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 说明产物清单与用法
74 lines
3.2 KiB
TypeScript
74 lines
3.2 KiB
TypeScript
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;
|