更新打字稿对象

Ina*_*san 0 javascript interface typescript reactjs

当 Javascript 更新一个对象时,就像下面这样。

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


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

}

update('a');
Run Code Online (Sandbox Code Playgroud)

我用 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
}
Run Code Online (Sandbox Code Playgroud)

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

leo*_*ory 6

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

const updateData = (summaryType: keyof Summary) => { 
    data[summaryType] += 1
}
Run Code Online (Sandbox Code Playgroud)

如果您有对象文字,而不是其类型,则可以使用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;
} 
Run Code Online (Sandbox Code Playgroud)

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