【问题标题】:TypeScript error when accessing property of object literal访问对象文字的属性时出现 TypeScript 错误
【发布时间】:2016-09-16 04:10:49
【问题描述】:

我是 TypeScript 的初学者。 我在访问Object 的数据时遇到了一点问题。

let content:Array<string> = ["I", "am", "a", "beginner"]
let data:Object = {a: "foo", b: content}
console.log(data.a);
console.log(data['b']);
console.log(data.b);

此代码将在第 5 行出现错误。(JavaScript 中没有错误) 请给我解释一下。 感谢您的帮助。

【问题讨论】:

标签: typescript object-literal


【解决方案1】:

只需将data 的显式声明删除为Object,以便TypeScript 推断类型,即将其更改为类似这样的内容

let content:Array<string> = ["I", "am", "a", "beginner"]
let data = {a: "foo", b: content}
console.log(data.a);
console.log(data['b']);
console.log(data.b);

您在初始代码中出错的原因是因为您告诉 TypeScript 编译器 data 的类型为 Object 或任何派生类 - 因为类型 Object 没有属性 ab 这会导致错误。

请注意,删除显式类型注释与 AD.Net 建议的使用 any 不同,因为在这种情况下,TypeScript 仍然具有所有可用的类型信息 - 只是推断(参见 Visual Studio Code 的屏幕截图) ,而通过使用any,您是在告诉 TypeScript 编译器该变量可以引用任何导致不进行类型检查的东西。

【讨论】:

  • 您可能会提到初始分配有效的原因是 TS 忽略了 extra 属性。
  • #torazaburo 我开始学习 Typescript。我的项目中的数据有问题。但现在我明白了。
  • 不使用any这点很好,我有一段时间没用TS了:(
【解决方案2】:

你可以指定data:any,至少不会报错。如果你想要智能感知,你需要为data 创建一个type/interface,例如

interface myData{
    a:string;
    b:Array<String>
}
data:myData

那么你就可以拥有智能感知了。

【讨论】:

    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2020-09-25
    • 2020-07-26
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多