UNPKG

default-template

Version:

一个用于定义默认值和转换对象结构的实用工具

149 lines (148 loc) 4.32 kB
/** * 用于自定义键名转换的函数类型 * @param oldKey 原始键名 * @returns 转换后的新键名 */ export type TemplateNewKeyFn = (oldKey: string) => string; /** * 默认模板选项接口 */ export interface DefaultTemplateOption { /** * 用于匹配所有键的通配符键名,默认为 '?' */ allTemplateKey?: string; } /** * 表示一个普通对象的接口 */ export interface PlainObject { /** * 索引签名,允许任意字符串键和任意类型值 */ [key: string]: any; } /** * 模板重命名类,用于处理对象键名的重命名和值的转换 */ export declare class TemplateRename { /** * 新的键名或键名转换函数 */ key: string | TemplateNewKeyFn; /** * 值的模板定义 */ def: any; /** * 创建一个模板重命名实例 * @param key 新的键名或键名转换函数 * @param def 值的模板定义 */ constructor(key: string | TemplateNewKeyFn, def: any); } /** * 根据模板类型 T 递归推导最终返回类型: * - 如果是函数,取其返回值类型 * - 如果是数组,递归处理元素类型 * - 如果是对象,递归处理每个字段 * - 其他类型原样返回 */ export type TemplateResult<T> = T extends (...args: any[]) => infer R ? R : T extends Array<infer U> ? Array<TemplateResult<U>> : T extends object ? { [K in keyof T]: TemplateResult<T[K]>; } : T; /** * 默认值模板函数,用于处理数据结构的默认值、类型转换和键名映射 * * 主要功能: * 1. null/undefined 值提供默认值 * 2. 自动转换值类型以匹配模板类型 * 3. 支持数组元素的模板处理 * 4. 支持对象属性的模板处理和键名映射 * 5. 支持通配符键处理所有未指定的属性 * * @example 基本类型处理 * ```typescript * defaultTemplate(10, undefined) // 返回: 10 * defaultTemplate(10, '20') // 返回: 20 (类型转换) * defaultTemplate(false, 'true') // 返回: true (类型转换) * ``` * * @example 数组处理 * ```typescript * defaultTemplate([10], [null, '20', 30]) // 返回: [10, 20, 30] * defaultTemplate([{ min: 0 }], [{ val: -1 }, { val: 5 }]) * // 返回: [{ min: 0, val: -1 }, { min: 0, val: 5 }] * ``` * * @example 对象处理 * ```typescript * defaultTemplate( * { a: 10, b: false, '?': true }, * { a: '20', c: null } * ) // 返回: { a: 20, c: true } * * // 嵌套对象处理 * defaultTemplate( * { user: { name: '', age: 0 } }, * { user: { name: 'John' } } * ) // 返回: { user: { name: 'John', age: 0 } } * ``` * * @example 键名映射 * ```typescript * // 静态键名映射 * defaultTemplate( * { a: new TemplateRename('newA', 10) }, * { a: '20' } * ) // 返回: { newA: 20 } * * // 动态键名映射 * defaultTemplate( * { '?': new TemplateRename(key => `prefix_${key}`, true) }, * { foo: false, bar: null } * ) // 返回: { prefix_foo: false, prefix_bar: true } * ``` * * @example 复杂嵌套结构 * ```typescript * const template = { * users: [{ * id: new TemplateRename('userId', ''), * profile: { * name: '', * settings: { '?': false } * } * }] * }; * const data = { * users: [{ * id: 'u123', * profile: { * name: 'John', * settings: { notifications: null, darkMode: true } * } * }] * }; * // 返回: { * // users: [{ * // userId: 'u123', * // profile: { * // name: 'John', * // settings: { notifications: false, darkMode: true } * // } * // }] * // } * ``` * * @param def 模板定义,指定默认值和类型。可以是: * - 基本类型值:用作默认值和类型示例 * - 数组:第一个元素作为所有数组元素的模板 * - 对象:键值对定义属性的模板,'?' 键作为通配符模板 * - TemplateRename:定义键名映射规则 * - null/undefined:表示保持原值不变 * @param src 源数据,需要处理的原始数据 * @param opt 选项配置,可以自定义通配符键名 * @returns 处理后的数据 */ export default function defaultTemplate<T>(def: T, src: any, opt?: DefaultTemplateOption): TemplateResult<T>;