javascript - 打字稿 - 没有带有“字符串”类型参数的索引签名
问题描述
Javascript 中的事情很简单:
interface Person {
id: number
red: number
green: number
blue: number
buckets: Array<BucketType>
// Does the index signature go here? What does it look like?
// I haven't seen any "standard" way of doing this
}
interface BucketType {
color: string,
weight: number
}
const personA = {
id: 123,
red: 4,
green: 5,
blue: 6,
buckets: [
{
color: 'Blue',
weight: 4
}
]
}
const personB = {
id: 456,
red: 7,
green: 8,
blue: 9,
buckets: [
{
color: 'Red',
weight: 10
}
]
}
const people = [ personA, personB ]
for (let person of people) {
for (let bucket of person.buckets) {
console.log(bucket.weight) // 4, then 10
console.log(bucket.color) // 'Blue', then 'Red'
bucket.weight += person[bucket.color.toLowerCase()] // ERROR: NO INDEX SIGNATURE!!!! (Typescript)
console.log(bucket.weight) // In pure Javascript, this logs '10', then '17'
}
}
老实说什么鬼。如何为我的人物类型添加“索引签名”,以便我可以继续我的生活?
为文字发牢骚道歉,我只是因为取得进步而精疲力尽,然后打字!
解决方案
Typescript 类型检查器正在抱怨,因为它无法检查您的代码是否不会导致错误。Typescript 类型检查器无法读取字符串 'Red' 和 'Blue' 的值,并且知道如果它们是小写的,它们会匹配对象上的属性。这只能在运行时完成,而不是在类型检查时完成。
因此,您必须向编译器提示可能的结果bucket.color.toLowerCase()
可能是这样的:
bucket.weight += person[bucket.color.toLowerCase() as 'red'|'blue'|'green'];
推荐阅读
- python - 将 int64 列转换为时间列
- mongodb - 从经过身份验证的用户那里获取所有文档(关系 OneToMany)
- java - Maven:“引起:java.lang.NoClassDefFoundError:com/omnesys/omne/om/OMN”
- java - 构造函数只应在 SonarQube 工具中调用不可覆盖的方法
- boost - 使用 mingw g++ 编译器在控制台编程环境中使用 boost
- keras - 在 tf.keras 模型中使用 keras h5 权重
- kubernetes - 父级的多个实例使用的 Helm 子图
- android - 升级到 gradle 4.0.0 杀死了按钮文本颜色
- mysql - MySQL 查询有什么问题?慢,并且有 Null 字段
- abap - 检查 WHERE 子句中 STRING_TABLE 中的值