【问题标题】:Difference between 'object' ,{} and Object in TypeScriptTypeScript 中 'object' 、{} 和 Object 之间的区别
【发布时间】:2023-03-11 00:51:01
【问题描述】:

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

foo: object

bar: {}

type: Object?


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

headers: object;

导致错误:

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

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

【问题讨论】:

  • 不知道有没有,因为好像没有。
  • 在某些情况下,TypeScript 会触发其中之一的错误。所以可能有一些。
  • 好吧,它们是可以相互分配的,所以请将您知道的任何此类错误案例添加到问题中。

标签: typescript


【解决方案1】:

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

如果禁用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

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2019-04-25
    • 2010-11-04
    相关资源
    最近更新 更多