default-template
Version:
一个用于定义默认值和转换对象结构的实用工具
149 lines (148 loc) • 4.32 kB
TypeScript
/**
* 用于自定义键名转换的函数类型
* @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>;