当要使用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)
答案 0 :(得分:3)
由于您要更新具有特定类型的对象,TS希望知道summaryType
是data
类型的有效属性名称(键)。
在这种情况下,您可以简单地将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代码中引入了潜在的错误。检查器正在避免。