TypeScript中如何安全为访问对象参数化属性的函数做类型标注
TypeScript 实现setProperty函数的类型标注方案
核心实现
利用TypeScript泛型约束实现类型校验,最终标注后的代码如下:
function setProperty<T extends object, K extends keyof T>(subject: T, property: K, value: T[K]): void { subject[property] = value; }
类型约束说明
- 泛型
T extends object:限定第一个参数subject必须为对象类型 - 泛型
K extends keyof T:限定第二个参数property只能是subject对象上存在的合法键名,因为你明确property为硬编码字面量,TypeScript可直接静态推断出字面量对应的精确键类型,不会退化为通用string类型 - 参数
value: T[K]:自动将第三个参数的类型绑定为subject对象上property对应属性的类型,类型不匹配时会直接触发编译错误
使用示例
// 定义测试对象类型 interface User { name: string; age: number; isAdmin: boolean; } const testUser: User = { name: "张三", age: 25, isAdmin: false }; // 合法调用,无编译错误 setProperty(testUser, "name", "李四"); setProperty(testUser, "age", 30); // 非法调用,编译阶段直接报错 setProperty(testUser, "gender", "男"); // 错误:gender不是User类型的合法键 setProperty(testUser, "age", "30"); // 错误:age属性类型为number,不可传入string类型值
如果使用const声明的字面量变量作为property参数,也可以正常完成类型校验:
const ageKey = "age" as const; setProperty(testUser, ageKey, 35); // 正常通过类型校验
内容的提问来源于stack exchange,提问作者Leonardo Raele
相关产品推荐
相关产品推荐

