Javascript Typescript-没有带类型为';的参数的索引签名;字符串';

Javascript Typescript-没有带类型为';的参数的索引签名;字符串';,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,在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 }

在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'
  }

}
接口人{
身份证号码
红色:号码
绿色:数字
蓝色:号码
桶:数组
//索引签名在这里吗?它看起来像什么?
//我还没有看到任何“标准”的方法来做这件事
}
接口Buckettetype{
颜色:字符串,
重量:数字
}
const personA={
id:123,
红色:4,
绿色:5,
蓝色:6,
水桶:[
{
颜色:“蓝色”,
体重:4
}
]
}
const personB={
身份证号码:456,
红色:7,
绿色:8,
蓝色:9,
水桶:[
{
颜色:“红色”,
体重:10
}
]
}
const people=[personA,personB]
为了(让人成为人){
为了(让一桶人。桶){
console.log(bucket.weight)//4,然后是10
console.log(bucket.color)/“蓝色”,然后是“红色”
bucket.weight+=person[bucket.color.toLowerCase()]//错误:没有索引签名!!!!(Typescript)
console.log(bucket.weight)//在纯Javascript中,记录“10”,然后记录“17”
}
}
老实说,这到底是怎么回事。我如何在我的个人类型中添加“索引签名”,以便继续我的生活


很抱歉发短信发牢骚,我已经精疲力竭了,无法再继续打字了

Typescript类型检查器正在抱怨,因为它无法检查代码是否不会导致错误。Typescript类型检查器无法读取字符串“Red”和“Blue”的值,并且知道如果它们是小写的,则它们与对象上的属性匹配。这只能在运行时完成,不能在类型检查时完成

因此,您必须向编译器提示
bucket.color.toLowerCase()
的可能结果如下:

bucket.weight += person[bucket.color.toLowerCase() as 'red'|'blue'|'green'];

这回答了你的问题吗?不,因为我不知道这些答案对我的问题意味着什么。谢谢你,但是我已经看过很多次了。我想知道的是“如何”添加索引签名来修复此错误。我将用我的person界面更新帖子。当定义
personA:any={}
personB:any={}
时,请尝试为每个person对象使用type。这里是否有一种简写或可重复使用的方法来指定可能性?如果我有一组更大的可能选项,并且需要在代码中的多个位置使用它,那么多次写出列表似乎很愚蠢。我相信你可以做
type BucketColor='red'|'blue'|'green'
然后做
bucket.color.toLowerCase()作为BucketColor