通用函数映射器是可配置、可复用的动态分发机制,以输入特征为键关联处理函数,支持精确匹配、类型匹配和谓词判断,提供统一调用接口、运行时增删组合及类型安全校验。

通用函数映射器的核心是:把输入值(或其某个特征)作为“键”,动态关联并调用对应的处理函数,同时支持扩展、默认兜底和类型安全。它不是硬编码的 switch 或 if-else,而是可配置、可复用的分发机制。
定义映射规则:函数与触发条件的绑定
映射器需要明确“什么输入 → 调用哪个函数”。常见方式有三种:
- 精确值匹配:如 status = "success" → handleSuccess()
- 类型/构造器匹配:如 input 是 Date 实例 → formatDate()
- 谓词函数判断:如 isEmail(input) → validateEmail(),更灵活但需注意执行顺序
推荐用对象字面量 + Symbol 或 Map 存储规则,避免原型污染;对复杂条件,用数组保存 { predicate, handler } 元组,按序遍历。
统一调用接口:输入 → 查找 → 执行 → 返回
对外只暴露一个函数,例如 map(input, options?),内部逻辑清晰分三步:
- 遍历映射表,用 keyExtractor(input) 获取比对值(默认为 input 本身),或执行 predicate 判断
- 找到首个匹配项后,用 handler(input, ...extraArgs) 执行,支持透传额外参数
- 未命中时,返回 options?.fallback(input) 或抛出 Error,不静默失败
示例:map(42, { keyExtractor: x => x % 3, rules: { 0: () => 'divisible by 3', 1: () => 'rem 1' } }) → 'rem 1'
支持运行时增删与组合
真正的“通用”意味着可演进。提供方法如:
- add(key, handler):追加单条规则(支持覆盖)
- merge(otherMapper):合并另一映射器,后者优先级可配置
- remove(key):按 key 或 predicate 引用删除(需保留 handler 引用)
内部用 WeakMap 缓存 handler 元数据,避免内存泄漏;对高频调用场景,可加简单 LRU 缓存匹配结果(如 input → handler 引用)。
兼顾类型提示与运行时安全
TypeScript 用户可定义泛型 Mapper,约束 rules 的 key 类型与 handler 签名:
type MapperRule = { predicate: (x: Input) => boolean; handler: (x: Input) => Output };运行时建议做基础校验:handler 必须是函数、predicate 返回布尔值、fallback 存在且可调用。不强制要求所有分支覆盖,但应明确告知缺失时的行为。











