我正在用打字稿写一个对象,代码是:
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"
,
它有效,有人可以解释吗?谢谢
答案 0 :(得分:3)
看这行:
if
您已明确声明const obj3:object = {name: "wewda"};
的类型为obj3
,有效地丢弃了有关对象可以包含哪些属性的任何信息。顺便说一下,类型object
是代表非基本类型的类型,即不是object
,number
,string
,{{1} },boolean
或symbol
。
因此,类型系统无法验证null
是否有效。但是,如果您使用默认的编译器选项(相当宽松)运行,则将允许使用undefined
,因为obj3.name
将隐式转换为obj3['name']
,即使原则上是一样的不安全。我通常建议您启用obj3
编译器选项,以防止这种不安全的访问。
还请注意,这是您键入时的编译时错误,而不是运行时错误。换句话说,any
的 value 仍然具有属性--noImplicitAny
,但 type obj3
却没有。