如何声明 T[K] 的类型为 X 的函数参数类型的索引器类型,因此 t[k]=x 将是一个有效的表达式

问题描述

我试图定义一个函数,当给出对象和属性名称时,该函数修改对象的布尔属性。我在这里找到了几乎可以满足我想要的东西

https://stackoverflow.com/a/42615501/1527544

调用方来看它工作正常,但函数体仍然会产生错误。如何在不使用 ts-ignore 抑制它的情况下处理它?

Live example TSPlayground

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;

请注意,这是一个有效的向上转换,因此所有类型检查仍然有效。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...