TypeScript 中 'object' ,{} 和 Object 之间的区别

问题描述 投票:0回答:2

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

foo: object

bar: {}

type: Object


示例:尝试将

object
分配给假设处理请求标头信息的变量:

headers: object;

导致错误:

类型“object”不可分配给“{ [key: string]: string }”。

如果使用

headers: {}
,也会满足相同的条件,从而得出结论:
{}
的要求稍微不那么严格。

typescript
2个回答
143
投票

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 }

86
投票

以下示例显示不同类型的对象的行为有何不同:

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

链接到 TypeScript 游乐场

© www.soinside.com 2019 - 2024. All rights reserved.