如何在TypeScript中为泛型类型属性的函数参数标注类型?
解决TypeScript中约束对象布尔属性的函数参数问题
你可以通过引入第二个泛型参数并添加类型约束,实现无需类型断言的类型安全赋值:
方法一:双泛型参数自动推导
这种写法让TypeScript在调用时自动检查属性类型,函数内部无需额外断言:
function doThing<T, K extends keyof T>(object: T, propertyOfT: K) { object[propertyOfT] = true; } // 调用示例 const testObj = { isActive: true, username: "jack" }; doThing(testObj, "isActive"); // ✅ 合法,属性值为boolean doThing(testObj, "username"); // ❌ 编译报错:true无法赋值给string类型
方法二:显式约束属性类型(TypeScript 4.9+)
使用where子句,在函数定义阶段就明确约束目标属性的类型为boolean,逻辑更清晰:
function doThing<T, K extends keyof T>(object: T, propertyOfT: K): void where T[K] extends boolean { object[propertyOfT] = true; }
方法三:基于映射类型的优化(避免断言)
如果你坚持使用自定义的布尔属性键类型,可以通过类型缩小规避断言:
type BooleanKey<T> = { [K in keyof T]: T[K] extends boolean ? K : never }[keyof T]; function doThing<T>(object: T, propertyOfT: BooleanKey<T>) { // 通过类型缩小明确属性类型 const propValue: boolean = object[propertyOfT]; object[propertyOfT] = true; }
内容的提问来源于stack exchange,提问作者Cesar Martinez Dominguez
相关产品推荐
相关产品推荐

