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 有三种令人困惑的类型:Objectobject

如果禁用strictNullChecks 编译器选项,您可以将nullundefined 分配给所有三种类型,否则会出现编译错误。

对象

包含存在于所有 javascript 对象中的内容(如 toString()hasOwnProperty())。任何值(原始的、非原始的)都可以分配给Object 类型。

是一个空对象。它在运行时与Object 非常相似,但在编译时不同。在编译时 没有Object 的成员,Object 有更严格的行为(参见@golmschenk 的评论)。

对象

objectwas introduced in TypeScript 2.2。它是任何非原始类型。您不能为其分配任何原始类型,例如 boolnumberstringsymbol

因此,如果你想试试这个:

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、object、 的区别

使用 TypeScript 和 Object.assign 给我一个错误“属性 'assign' 在类型 'ObjectConstructor' 上不存在”

如何使 Object.entries 在 TypeScript 中可用? [复制]

如何在 TypeScript 中获取 JSON 文件上的 Object.keys 时设置类型?

TypeScript:为啥数字可以分配给 Object 类型的引用?

第三节:TypeScript对象类型