更新打字稿对象

时间:2020-04-26 00:42:05

标签: javascript reactjs typescript interface

当要使用Javascript更新对象时,就像下面这样。

const data = {
    a: 1,
    b: 3,
    c: 4
}


const update = (summary) => {
  data[summary] += 1;
  console.log(data);

}

update('a');

我用Typescript尝试了同样的事情,但它不能正常工作 我知道我做错了什么,有人可以指出错误以及如何解决问题。

interface Summary { 
    a: number,
    b: number,
    c: number
}

const data: Summary = {
    a: 1,
    b: 3,
    c: 4
}


const updateData = (summaryType: string) => { 
    data[summaryType] += 1 // Error
}

错误为->元素隐式地具有“ any”类型,因为类型“ string”的表达式不能用于索引类型“ Summary”。在“摘要”类型上找不到带有“字符串”类型参数的索引签名。(7053)

1 个答案:

答案 0 :(得分:3)

由于您要更新具有特定类型的对象,TS希望知道summaryTypedata类型的有效属性名称(键)。 在这种情况下,您可以简单地将summaryType定义为Summary的键,字面意思是:

const updateData = (summaryType: keyof Summary) => { 
    data[summaryType] += 1
}

如果您有对象文字而不是其类型,则可以使用typeof obj获取其类型,然后再次使用keyof获取有效键:

const obj = {
  a: 1,
  b: 2,
  c: 3
}

const ObjType = typeof obj;

function update(type: keyof ObjectType) { // or just `keyof typeof obj`
  obj[type] += 1;
} 

如果您不知道类型,或者想忽略该错误,则即使您不习惯这样做,也可以使用data[summaryType as any],因为这是因为您在TS代码中引入了潜在的错误。检查器正在避免。