如何在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
相关产品推荐
相关产品推荐

