TypeScript 中 'object' 、 和 Object 之间的区别
Posted
技术标签:
【中文标题】TypeScript 中 \'object\' 、 和 Object 之间的区别【英文标题】:Difference between 'object' , and Object in TypeScriptTypeScript 中 'object' 、 和 Object 之间的区别 【发布时间】:2018-09-03 00:20:41 【问题描述】:试图找出 TypeScript 中这两种类型之间的区别:
foo: object
和
bar:
和
type: Object
?
示例:尝试将object
分配给假定处理请求标头信息的变量:
headers: object;
导致错误:
类型 'object' 不能分配给 ' [key: string]: string `。
如果使用headers:
,同样的条件也会通过,从而得出 的要求稍微不那么严格的结论。
【问题讨论】:
不知道有没有,因为好像没有。 在某些情况下,TypeScript 会触发其中之一的错误。所以可能有一些。 好吧,它们是可以相互分配的,所以请将您知道的任何此类错误案例添加到问题中。 【参考方案1】:TypeScript 有三种令人困惑的类型:Object
、 和
object
。
如果禁用strictNullChecks
编译器选项,您可以将null
和undefined
分配给所有三种类型,否则会出现编译错误。
对象
包含存在于所有 javascript 对象中的内容(如 toString()
、hasOwnProperty()
)。任何值(原始的、非原始的)都可以分配给Object
类型。
是一个空对象。它在运行时与
Object
非常相似,但在编译时不同。在编译时 没有
Object
的成员,Object
有更严格的行为(参见@golmschenk 的评论)。
对象
object
was introduced in TypeScript 2.2。它是任何非原始类型。您不能为其分配任何原始类型,例如 bool
、number
、string
、symbol
。
因此,如果你想试试这个:
var strictTypeHeaders: [key: string]: string = ; // non-primitive type
var header: object = ;
header = strictTypeHeaders; // its OK
strictTypeHeaders = header; // causes error "Type 'object' is not assignable to type ' [key: string]: string `"
你会在最后一行得到编译错误。这是因为 [key: string]: string
类型比object
类型更具体。 header = strictTypeHeaders
没有任何错误,因为这两种类型都是非原始类型,object
比 [key: string]: string
更常见
【讨论】:
请不要说“任何对象(原始、非原始、空等)”而是“任何值”。原语不是对象。 好答案。添加参考网址(如果有)会很棒。 在 TS 中,如果函数参数的类型为:
,我无法调用值为 null
.. 的函数。似乎与上述相矛盾。
Object
和
并不完全相同。内置方法对Object
具有预定义的强制类型,但对
没有。所以let x: = toString() return 2
会运行,但let x: Object = toString() return 2
会导致错误(因为toString
需要为Object
返回一个字符串,而不是
)。【参考方案2】:
以下示例显示了不同类型的对象如何表现不同:
var o: object;
o = prop: 0 ; // OK
o = []; // OK
o = 42; // Error
o = "string"; // Error
o = false; // Error
o = null; // Error
o = undefined; // Error
var p: ; // or Object
p = prop: 0 ; // OK
p = []; // OK
p = 42; // OK
p = "string"; // OK
p = false; // OK
p = null; // Error
p = undefined; // Error
var q: [key: string]: any ;
q = prop: 0 ; // OK
q = []; // OK
q = 42; // Error
q = "string"; // Error
q = false; // Error
q = null; // Error
q = undefined; // Error
var r: [key: string]: string ;
r = prop: 'string' ; // OK
r = prop: 0 ; // Error
r = []; // Error
r = 42; // Error
r = "string"; // Error
r = false; // Error
r = null; // Error
r = undefined; // Error
由此我们可以看出:
与类型 Object
相同,是最不具体的。您可以为其分配对象、数组和原语。
object
更具体,类似于 [key: string]: any
。您可以为其分配对象和数组,但不能为其分配基元。
[key: string]: string
是最具体的,它不允许将具有非字符串值的任何原始类型、数组或对象分配给它。
Link to TypeScript playground
【讨论】:
以上是关于TypeScript 中 'object' 、 和 Object 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
使用 TypeScript 和 Object.assign 给我一个错误“属性 'assign' 在类型 'ObjectConstructor' 上不存在”
如何使 Object.entries 在 TypeScript 中可用? [复制]
如何在 TypeScript 中获取 JSON 文件上的 Object.keys 时设置类型?