如何为含字典键元组与对应类型参数函数的对象定义强类型?
实现基于字典键的类型安全验证对象类型
要实现你需要的类型约束,我们可以通过泛型元组映射让TypeScript自动推导函数参数的类型,同时确保参数数量与args元组完全匹配。以下是具体实现方案:
完整代码示例
type Dict = { s: string; n: number; b: boolean; d: Date; } // 定义泛型类型TypedObject,K表示args对应的键元组类型 type TypedObject<K extends readonly (keyof Dict)[]> = { args: K; // 将元组K中的每个键映射为Dict对应的类型,生成func的参数列表 func: (...args: { [Idx in keyof K]: Dict[K[Idx]] }) => void; } // 辅助函数:自动推断每个对象的泛型参数,简化使用流程 function createTypedObject<K extends readonly (keyof Dict)[]>(obj: TypedObject<K>) { return obj; } // 使用示例 const typedObjects = [ createTypedObject({ args: ['s'], func: (s) => console.log(typeof s) }), // s被推断为string createTypedObject({ args: ['n'], func: (n) => console.log(typeof n) }), // n被推断为number createTypedObject({ args: ['s', 'b'], func: (s, b) => console.log(typeof s, typeof b) }), // s:string, b:boolean ];
核心逻辑说明
- 泛型约束:
K extends readonly (keyof Dict)[]确保args只能是Dict键组成的只读元组,避免传入无效键值。 - 元组类型映射:
{ [Idx in keyof K]: Dict[K[Idx]] }遍历K元组的每个索引,将对应的键映射为Dict中定义的类型,最终生成与args长度、类型完全匹配的函数参数列表。 - 辅助函数的作用:通过
createTypedObject自动推断每个对象的K类型,无需手动添加as const断言,让代码更简洁易读。
错误检查验证
TypeScript会自动拦截不符合规则的代码:
- 参数数量不匹配时触发报错:
// 报错:函数参数数量与args长度不一致 createTypedObject({ args: ['s', 'b'], func: (s) => console.log(typeof s) }); - 参数类型不匹配时触发报错:
// 报错:参数s的类型number与预期的string不兼容 createTypedObject({ args: ['s'], func: (s: number) => console.log(typeof s) });
内容的提问来源于stack exchange,提问作者dslatkin
相关产品推荐
相关产品推荐

