import { IDtoType } from "../meta/lib/dtoExtractMeta" /** Dto 定义的实际数据 */ export interface IDtoDefine { __isDto__: true type: IDtoType meta?: IDtoMeta isOptional?: boolean isNullable?: boolean IsOr?: boolean list?: IDtoDefine[] nest?: any } /* prettier-ignore */ export type IDtoMeta = { is?: ((value:any) => { isOk:boolean, msg?:string }) | ((value:any) => { isOk:boolean, msg?:string })[]; } & TMore & Record export interface IDtoVerifyResult { isOk: boolean msg?: string } export type IDtoVerify = (val: any, dto: IDtoDefine, meta?: IDtoMeta) => IDtoVerifyResult export type IDtoFuncBase = (meta?: IDtoMeta) => TShow // ============================================================================ // Object/Array 类型推断工具 // ============================================================================ /** 展平交叉类型,提高类型可读性 */ type Prettify = { [K in keyof T]: T[K] } & {} /** 检测类型是否包含 undefined 或 null(可选类型) */ type IsOptionalType = undefined extends T ? true : null extends T ? true : false /** 从 DTO 定义中提取可选字段的键(类型包含 undefined 或 null) */ type OptionalKeys = { [K in keyof T]: IsOptionalType extends true ? K : never }[keyof T] /** 从 DTO 定义中提取必需字段的键 */ type RequiredKeys = { [K in keyof T]: IsOptionalType extends true ? never : K }[keyof T] /** * 从 DTO 对象定义推断出实际的 TypeScript 类型 * - 类型包含 undefined 或 null 的字段会变成可选字段 (?) */ export type InferDtoObject> = Prettify< { [K in RequiredKeys]: T[K] } & { [K in OptionalKeys]?: T[K] } > export type IDtoFuncArray = { ({}, meta: IDtoMeta): any[] (dtoTypes: T, meta?: IDtoMeta): T >(dtoTypes: T, meta?: IDtoMeta): InferDtoObject[] (dtoTypes: T, meta?: IDtoMeta): T[] } export type IDtoFuncObject = >(nest?: T, meta?: IDtoMeta) => InferDtoObject