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

如何在TypeScript中为函数参数标注类型以匹配对象属性类型,并实现泛型版本?

实现TypeScript严格类型匹配的属性设置函数(含泛型版本)

你这个需求其实是TypeScript里典型的键值类型关联场景,核心是利用泛型和索引类型让TypeScript自动推导对应属性的类型。我分两个场景给你拆解:

一、针对特定接口MyStorage的setProp函数

你已经知道用keyof MyStorage约束prop的可选值,但要让value和prop的类型严格绑定,需要给函数加一个泛型参数,把prop的具体类型绑定到泛型上,再通过索引访问类型MyStorage[K]获取对应属性的类型。

修改后的代码如下:

interface MyStorage {
  prop1?: string;
  prop2?: number;
  prop3?: boolean;
  prop4?: Array<string>;
  prop5?: 'value1' | 'value2';
}

const myStorage: MyStorage = {};

// K为泛型参数,约束为MyStorage的键类型
const setProp = <K extends keyof MyStorage>(prop: K, value: MyStorage[K]) => {
  myStorage[prop] = value;
}

类型检查验证:

  • setProp('prop1', 'Ok'); ✅ 合法:prop1对应string类型,传入字符串匹配
  • setProp('prop1', 5); ❌ 不合法:number类型与prop1的string类型不匹配
  • setProp('prop5', 'value1'); ✅ 合法:符合prop5的字面量联合类型
  • setProp('prop5', 'value5'); ❌ 不合法:'value5'不在prop5的可选值范围内

二、适用于任意对象的泛型版本genericSetProp

要让函数适配任意对象类型,只需要扩展泛型参数为两个:一个是对象的类型T,另一个是该对象的键类型K(约束为keyof T)。这样不管传入什么结构的对象,TypeScript都能自动关联键和对应值的类型。

修改后的泛型函数代码:

// T为任意对象类型,K为T的键类型
const genericSetProp = <T, K extends keyof T>(prop: K, value: T[K], storage: T) => {
  storage[prop] = value;
}

类型检查验证(用之前的myStorage测试):

  • genericSetProp('prop1', 'Ok', myStorage); ✅ 合法
  • genericSetProp('prop1', 5, myStorage); ❌ 不合法
  • genericSetProp('prop5', 'value1', myStorage); ✅ 合法
  • genericSetProp('prop5', 'value5', myStorage); ❌ 不合法

这里的核心逻辑是泛型参数的绑定:通过把K作为具体的键类型传入,让TypeScript精准地从对象类型中取出对应属性的类型,实现严格的类型校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:58:09