【发布时间】:2019-12-06 20:10:34
【问题描述】:
在纯 JavaScript 中,我们可以使用变量读取对象属性的值。
也就是说,这是有效的:
let obj = { a: 100, b: 'Need help with TypeScript', c: new Date() };
let prop = 'b';
console.log( obj[prop] ); // Need help with TypeScript
但是,以下将 prop 声明为字符串的 TypeScript 注释会导致指示的索引错误。
let obj: object = { a: 100, b: 'Need help with TypeScript', c: new Date() };
let prop: string = 'b';
console.log( obj[prop] ); // TypeScript error element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
我应该如何注释上面的内容?
2019 年 12 月 9 日编辑:当我发布问题时,我假设会有一个通用答案,而不是一个明确依赖于我的示例对象的答案。
我的用例是一个函数,它接受属性名称作为参数。该函数根据传递的属性名称对数组进行排序。我移植到 TS 的原始 JavaScript 代码将对任何对象数组进行排序。
【问题讨论】:
-
根本不要注释
obj;让它被推断为类型{a: number, b: number, c: number}。至于prop,你也不需要注解,但你要么把let改成const,要么用let prop = "b" as const,比如this。 -
@jcalz - 感谢您的评论和示例。我查看了示例并且它有效,但我不明白它为什么有效。为什么将属性声明为
const会有所不同。对于我的具体情况,我还没有机会尝试您的建议。我会的。 (请参阅我今天所做的修改。) -
"为什么将属性声明为
const会有所不同" 编译器将const视为表明该值不会改变的意图(这仅适用于原语,但无论如何) , 所以它推断它是一个更窄的类型。如果您写let prop = "b",它猜测您希望prop成为string,因为您可能稍后将其更改为其他string。如果你写const prop = "b",它知道prop永远是"b",所以它推断出字符串文字类型"b"。如果它满足您的需求,我很乐意将其转化为答案。
标签: typescript