如何为返回对象属性引用的TypeScript函数添加强类型约束?
问题修复方案
错误原因
你定义泛型时使用的K = keyof O是为泛型参数设置默认值,而非约束K的类型范围,TypeScript无法保证传入的prop一定是object的合法键,因此会抛出索引不合法的错误。
修复后的完整代码
export function getPropertyReference<O extends Record<PropertyKey, any>, K extends keyof O>(object: O, prop: K): O[K] { return { get value(): O[K] { return object[prop]; }, set value(to: O[K]) { object[prop] = to; } }.value; }
改动说明
- 把泛型参数的默认值声明替换为
extends类型约束:O extends Record<PropertyKey, any>约束第一个入参必须是合法的对象类型K extends keyof O约束第二个入参必须是传入对象的合法键,从根源上保证索引操作的合法性
- 同时将getter、setter的返回值类型从
any替换为O[K],消除所有隐式any类型,实现完全的类型安全
效果验证
使用时TypeScript会自动推导返回值的对应类型,赋值不匹配类型时会提前报错:
const testObj = { name: "测试", age: 20 }; const nameRef = getPropertyReference(testObj, "name"); // nameRef自动推导为string类型 nameRef = "新名称"; // 正常赋值 nameRef = 123; // TS直接抛出类型错误提示 console.log(testObj.name); // 输出"新名称"
内容的提问来源于stack exchange,提问作者lanye74
相关产品推荐
相关产品推荐

