试图找出TypeScript中这两种类型之间的区别:
foo: object
和
bar: {}
?
示例:尝试将object
分配给假设处理请求标头信息的变量:
headers: object;
导致错误:
类型'object'不能赋值给'{[key:string]:string}`。
如果使用headers: {}
,则会通过相同的条件,从而得出{}
的要求稍微不那么严格的结论。
答案 0 :(得分:6)
基本上,TypeScript有三种令人困惑的类型:Object
,{}
和object
。
包含所有JavaScript对象中存在的内容。可以将任何值(基元,非基元,空等)分配给Object
类型。
{}
是一个空对象。它与Object
相同。
object
was introduced in TypeScript 2.2。它是任何非原始类型。您无法为其分配任何原始类型,例如bool
,number
,string
,symbol
,null
和undefined
,.
因此,如果你试试这个:
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 }
更常见
答案 1 :(得分:5)
以下示例显示了不同类型的对象如何表现不同:
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: {};
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 }
是最具体的,不允许为其分配具有非字符串值的任何原始类型,数组或对象。