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

如何编写参数为属性名和对应属性值的TypeScript泛型函数?

解决方案

场景1:接收对象、属性名、属性值三个参数

你原来的写法仅声明了对象类型F这一个泛型参数,keyof F会被推导为该对象所有键的联合类型,对应的值类型自然也会变成所有值的联合。只需新增一个绑定具体键的泛型参数即可:

declare function add<F extends object, K extends keyof F>(obj: F, prop: K, value: F[K]): void;

// 调用测试
add({a: 1, b: false}, 'b', 42); // 编译器抛出错误:类型“number”的参数不能赋给类型“boolean”的参数

这里泛型K会和你传入的具体prop参数绑定,F[K]就能精确匹配到该属性对应的类型,传入错误类型的值会直接触发类型报错。

场景2:提前指定对象类型,仅接收属性名、属性值两个参数

如果需要提前固定对象的类型,不需要每次传入对象,我们可以通过柯里化拆分泛型参数,避免需要手动填写所有泛型的问题:

// 外层函数固定对象类型F,返回实际执行的函数
declare function add<F extends Record<string, unknown>>(): <K extends keyof F>(name: K, value: F[K]) => void;

// 调用测试
const addForTarget = add<{a: number; b: boolean}>();
addForTarget('a', true); // 编译器抛出错误:类型“boolean”的参数不能赋给类型“number”的参数

如果你使用的是TypeScript 5.0及以上版本,也可以用部分类型推断的语法,不用柯里化也能实现效果:

declare function add<F extends Record<string, unknown>, K extends keyof F>(name: K, value: F[K]): void;

// 用_表示让TS自动推断第二个泛型参数K
add<{a: number; b: boolean}, _>('a', true); // 编译器抛出错误

内容的提问来源于stack exchange,提问作者Jesper Jensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:39:03