微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何声明 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;

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?