问题描述
我试图定义一个函数,当给出对象和属性名称时,该函数将修改对象的布尔属性。我在这里找到了几乎可以满足我想要的东西
https://stackoverflow.com/a/42615501/1527544
从调用方来看它工作正常,但函数体仍然会产生错误。如何在不使用 ts-ignore 抑制它的情况下处理它?
function handleFlag<T extends {[key in P]: boolean },P extends keyof T>(data: T,field: P & keyof T) {
data[field] = false; //yelds error Type 'boolean' is not assignable to type 'T[P & keyof T]'.(2322)
// how to let compiler kNow that data[field] is actually of type boolean and should be allowed?
}
//caller side works fine
handleFlag({flag:true,name:'foo'},"flag"); //totally correct - no error
handleFlag({flag:true,"name"); //gives error,since name is not a boolean - very desired behavior
在我的另一个问题 How to declare argument type as key of given object in Typescript? 中,建议我阅读 this 但我不知道那里发生了什么......
解决方法
不是最优雅的方式,但您可以将其转换为帮助编译器:
(data as {[key in P]: boolean })[field] = false;
请注意,这是一个有效的向上转换,因此所有类型检查仍然有效。