尝试找出 TypeScript 中这两种类型之间的区别:
foo: object
和
bar: {}
和
type: Object
?
示例:尝试将
object
分配给假设处理请求标头信息的变量:
headers: object;
导致错误:
类型“object”不可分配给“{ [key: string]: string }”。
如果使用
headers: {}
,也会满足相同的条件,从而得出结论:{}
的要求稍微不那么严格。
TypeScript 具有三种令人困惑的类型:
{}
、Object
和 object
。您不能将 undefined
或 null
分配给任何这些类型,除非禁用 strictNullChecks
编译器选项。
{}
包含除 undefined
和 null
之外的任何值。
Object
包含具有常见内置属性的值(例如 toString
、hasOwnProperty
)。它比 {}
更严格,因为它需要一些内置属性。例如,undefined
、null
和{ toString() { return 1; } }
不能分配给Object
(参见@golmschenk的评论)。
object
包含非原始值。 原始值(未定义、Null、布尔值、数字、BigInt、字符串或符号)无法分配给 object
。 object
是在 TypeScript 2.2 中引入的。
因此:
const x: {} = {};
const y: object = {};
const z: Object = {};
let headers: { [key: string]: string };
headers = x; // okay: {} is assignable to { [key: string]: string }
headers = y; // error: object is not assignable to { [key: string]: string }
headers = z; // error: Object is not assignable to { [key: string]: string }
以下示例显示不同类型的对象的行为有何不同:
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 }
是最具体的,不允许将任何原始类型、数组或具有非字符串值的对象分配给它。