You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含字典键元组与对应类型参数函数的对象定义强类型?

实现基于字典键的类型安全验证对象类型

要实现你需要的类型约束,我们可以通过泛型元组映射让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
];

核心逻辑说明

  1. 泛型约束:K extends readonly (keyof Dict)[]确保args只能是Dict键组成的只读元组,避免传入无效键值。
  2. 元组类型映射:{ [Idx in keyof K]: Dict[K[Idx]] }遍历K元组的每个索引,将对应的键映射为Dict中定义的类型,最终生成与args长度、类型完全匹配的函数参数列表。
  3. 辅助函数的作用:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:40:51