object、Object、{}の違い
TypeScriptではオブジェクトの型注釈をするとき、プロパティの型まで指定するのが一般的です。
typescript
let obj: { a: number; b: number };
typescript
let obj: { a: number; b: number };
そういった一般的な型注釈とは異なり、プロパティの型を指定せず、ざっくり「オブジェクトであること」を型注釈する方法もあります。object
型やObject
型、{}
型を使うものです。
typescript
let a: object;let b: Object;let c: {};
typescript
let a: object;let b: Object;let c: {};
これらはどれもオブジェクト型の値ならどんなものでも代入可能になる型です。
typescript
const a: object = {}; // OKconst b: Object = {}; // OKconst c: {} = {}; // OK
typescript
const a: object = {}; // OKconst b: Object = {}; // OKconst c: {} = {}; // OK
#
object型、Object型、{}型の違いobject
型やObject
型、{}
型の3つは類似する部分がありますが、object
型と他の2つは異なる点があります。
#
object型object
型はオブジェクト型の値だけが代入できる型です。JavaScriptの値はプリミティブ型かオブジェクト型かの2つに大分されるので、object
型はプリミティブ型が代入できない型とも言えます。
typescript
let a: object;a = { x: 1 }; // OKa = [1, 2, 3]; // OK。配列はオブジェクトa = /a-z/; // OK。正規表現はオブジェクト// プリミティブ型はNGa = 1; // NGa = true; // NGa = "string"; // NG
typescript
let a: object;a = { x: 1 }; // OKa = [1, 2, 3]; // OK。配列はオブジェクトa = /a-z/; // OK。正規表現はオブジェクト// プリミティブ型はNGa = 1; // NGa = true; // NGa = "string"; // NG
#
Object型Object
型はインターフェースです。valueOf
などのプロパティを持つ値なら何でも代入できます。したがって、Object
型にはnull
やundefined
を除くあらゆるプリミティブ型も代入できます。文字列型や数値型などのプリミティブ型は自動ボックス化により、オブジェクトのようにプロパティを持てるからです。
typescript
let a: Object;a = {}; // OK// ボックス化可能なプリミティブ型OKa = 1; // OKa = true; // OKa = "string"; // OK// nullとundefinedはNGa = null; // NGa = undefined; // NG
typescript
let a: Object;a = {}; // OK// ボックス化可能なプリミティブ型OKa = 1; // OKa = true; // OKa = "string"; // OK// nullとundefinedはNGa = null; // NGa = undefined; // NG
Object
型はTypeScriptの公式ドキュメントで使うべきでないとされています。理由はプリミティブ型も代入できてしまうためです。もしオブジェクト型ならなんでも代入可にしたい場合は、代わりにobject
型を検討すべきです。
#
{}型{}型
は、プロパティを持たないオブジェクトを表す型です。プロパティを持ちうる値なら何でも代入できます。この点はObject
型と似ていて、null
やundefined
を除くあらゆる型を代入できます。
typescript
let a: {};a = {}; // OK// ボックス化可能なプリミティブ型OKa = 1; // OKa = true; // OKa = "string"; // OK// nullとundefinedはNGa = null; // NGa = undefined; // NG
typescript
let a: {};a = {}; // OK// ボックス化可能なプリミティブ型OKa = 1; // OKa = true; // OKa = "string"; // OK// nullとundefinedはNGa = null; // NGa = undefined; // NG
#
object型、Object型、{}型の代入範囲object
型やObject
型、{}
型の代入範囲をまとめると次の図のようになります。