Typescript对象/对象 - 赋值问题

时间:2018-02-14 17:06:34

标签: typescript

为什么整个对象的赋值有效,但是属性的重新分配却没有(除非你使用属性名作为索引)?这有什么意义吗?

var m: object ;

m = { name: 'qwerty' };  // works


m.name = 'xyz'; // does not work

m["name"] = 'abc'; // works

尽管如此,我还不知道何时使用Objectobject{},因为这三个只匹配没有任何属性的对象 - 这些都是无用的。每当我想要匹配具有未知属性的对象时,我都会引用{ [x:string] any}any。那么这三个用户的实用用例是什么?

2 个答案:

答案 0 :(得分:4)

  

这根本没有意义吗?

是的,但这里有几种不同的类型检查规则。

object基本上是一种泛型类型,表示对类型检查器没有已知属性的对象。它允许您使用任何类型的结构为其分配任何类型的对象(非原始对象),因为这是它的重点 - 类似的Object{}类型也定义没有已知的属性,但是允许分配基元(如string),因为Object是所有JS对象的基础。稍后添加object作为表达非原始对象的方法。在任何情况下(objectObject{})当您尝试访问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'等错误。