为什么整个对象的赋值有效,但是属性的重新分配却没有(除非你使用属性名作为索引)?这有什么意义吗?
var m: object ;
m = { name: 'qwerty' }; // works
m.name = 'xyz'; // does not work
m["name"] = 'abc'; // works
尽管如此,我还不知道何时使用Object
,object
或{}
,因为这三个只匹配没有任何属性的对象 - 这些都是无用的。每当我想要匹配具有未知属性的对象时,我都会引用{ [x:string] any}
或any
。那么这三个用户的实用用例是什么?
答案 0 :(得分:4)
这根本没有意义吗?
是的,但这里有几种不同的类型检查规则。
object
基本上是一种泛型类型,表示对类型检查器没有已知属性的对象。它允许您使用任何类型的结构为其分配任何类型的对象(非原始对象),因为这是它的重点 - 类似的Object
和{}
类型也定义没有已知的属性,但是允许分配基元(如string
),因为Object
是所有JS对象的基础。稍后添加object
作为表达非原始对象的方法。在任何情况下(object
,Object
或{}
)当您尝试访问m.name
这样的特定属性时,类型检查器都不知道那是什么,所以你得到一个错误。默认情况下,基于索引的属性赋值m["name"]
具有更宽松的限制,即使类型检查器仍然不知道您没有收到错误 - 除非您打开noImplicitAny
然后执行在m["name"]
上说错误:
元素隐式具有“任意”类型,因为类型“{}”没有索引签名。
这应该指向正确的方向:如果您想用某种类型的 unknown 属性描述对象,您应该定义index signature:
let m: { [key: string]: string; };
m = { name: 'qwerty' }; // works
m.name = 'xyz'; // works
m["name"] = 'abc'; // works
答案 1 :(得分:1)
如果m
类型为{name: string}
或any
,则所有三项作业均有效。
object
类型为relatively new,我说您可以从更具体的类型中受益,例如捕获m.nmae = 'xyz'
等错误。