【问题标题】:TS2339: Property 'name' does not exist on type 'object'TS2339:“对象”类型上不存在属性“名称”
【发布时间】:2019-09-13 23:57:17
【问题描述】:

我正在用打字稿写一个对象,代码是:

const obj2 ={name:1}
obj2.name = 2;
console.log(obj2.name)
const obj3:object = {name: "wewda"}
obj3.name = 'dadsa';
obj3['name'] = "cxzcxz"
console.log(typeof obj2)
console.log(obj3)
console.log(typeof obj3)

我在第 5 行遇到错误:错误 TS2339:“对象”类型上不存在属性“名称”。 但如果我改用obj3['name'] = "cxzcxz", 它有效,有人可以解释吗?谢谢

【问题讨论】:

    标签: typescript


    【解决方案1】:

    看看这一行:

    const obj3:object = {name: "wewda"};
    

    您已明确声明 obj3 的类型为 object,从而有效地丢弃了有关该对象可以包含哪些属性的任何信息。顺便说一下,object 类型是表示非原始类型的类型,即任何不是numberstringbooleansymbolnullundefined 的类型.

    所以类型系统无法验证obj3.name 是否有效。但是,如果您使用默认编译器选项(相当宽松)运行,obj3['name'] 将被允许,因为obj3 将被隐式转换为any,即使原则上它同样不安全。我一般建议你启用--noImplicitAny 编译器选项来防止这种不安全的访问。

    还要注意,这是您输入的编译时错误,而不是运行时错误。换句话说,obj3 仍然具有属性 name,但 type object 没有。

    【讨论】:

    • 您可能还想回答关于为什么obj3['name'] 有效的问题的另一部分,因为它使用索引访问,隐式允许并键入any。解决这个问题的最好方法是打开--strict(或至少--noImplicitAny)编译器选项,这样你也会在那里得到一个错误。
    • @jcalz 感谢您的评论。我在如何清楚地表达这一点上磕磕绊绊。
    • 谢谢大家!当我启用 noImplicitAny 选项时,出现两个编译错误:types.ts(37,6): error TS2339: Property 'name' does not exist on type 'object'。 types.ts(38,1):错误 TS7017:元素隐式具有“任何”类型,因为类型“{}”没有索引签名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2016-03-14
    • 2017-02-25
    • 2021-11-24
    相关资源
    最近更新 更多