TypeScript中“对象”和{}之间的区别

时间:2018-03-24 12:23:06

标签: typescript ecmascript-6

试图找出TypeScript中这两种类型之间的区别:

foo: object

bar: {}

示例:尝试将object分配给假设处理请求标头信息的变量:

headers: object;

导致错误:

  

类型'object'不能赋值给'{[key:string]:string}`。

如果使用headers: {},则会通过相同的条件,从而得出{}的要求稍微不那么严格的结论。

2 个答案:

答案 0 :(得分:6)

基本上,TypeScript有三种令人困惑的类型:Object{}object

对象

包含所有JavaScript对象中存在的内容。可以将任何值(基元,非基元,空等)分配给Object类型。

{}

{}是一个空对象。它与Object相同。

对象

object was introduced in TypeScript 2.2。它是任何非原始类型。您无法为其分配任何原始类型,例如boolnumberstringsymbolnullundefined ,.

因此,如果你试试这个:

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 }是最具体的,不允许为其分配具有非字符串值的任何原始类型,数组或对象。