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

0le*_*leg 18 typescript ecmascript-6

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

foo: object

bar: {}


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

headers: object;
Run Code Online (Sandbox Code Playgroud)

导致错误:

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

如果使用相同的条件headers: {},则会导致结论{}略微不那么严格.

ora*_*rad 42

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

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
Run Code Online (Sandbox Code Playgroud)

有了这个,我们可以说:

  • {}这与 typeObject是最不具体的相同。您可以为其分配对象、数组和原语。
  • object更具体,类似于{ [key: string]: any }. 您可以为其分配对象和数组,但不能为其分配基元。
  • { [key: string]: string } 是最具体的,它不允许将具有非字符串值的任何原始类型、数组或对象分配给它。

链接到 TypeScript 游乐场

  • 请注意,在所有这些情况下,“console.log(typeof o)”都是“对象” (2认同)

Alb*_*rtK 20

打字稿有三种类型的困惑:Object{}object

如果禁用了编译器选项,则可以将null和分配undefined给所有这三种类型,strictNullChecks否则会发生编译错误。

宾语

包含所有JavaScript对象中存在的内容(例如toString()hasOwnProperty())。可以将任何值(原始,非原始)分配给Objecttype。

{}

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

宾语

object 是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 }`"
Run Code Online (Sandbox Code Playgroud)

您将在最后一行收到编译错误。发生这种情况是因为{ [key: string]: string }类型比object类型更具体。没有任何错误的header = strictTypeHeaders,因为这两种类型都是非原始的和object更常见的类型比{ [key: string]: string }

  • 请不要说“*任何对象(原始、非原始、空等)*”,而是“任何*值*”。原语不是对象。 (9认同)
  • `Object` 和 `{}` 并不完全相同。内置方法具有“Object”的预定义强制类型,但没有“{}”的预定义强制类型。因此 `let x: {} = {toString() { return 2 }}` 将运行,但 `let x: Object = {toString() { return 2 }}` 将导致错误(因为 `toString` 需要返回用于“Object”但不用于“{}”的字符串)。 (8认同)
  • 好答案。添加参考网址(如果有)会很棒。 (2认同)