object、Object、{}の違い
TypeScriptではオブジェクトの型注釈をするとき、プロパティの型まで指定するのが一般的です。
ts
letobj : {a : number;b : number };
ts
letobj : {a : number;b : number };
📄️ オブジェクトの型注釈
TypeScriptでオブジェクトの型注釈は、JavaScriptオブジェクトリテラルのような書き方で、オブジェクトプロパティをキーと値の型のペアを書きます。
そういった一般的な型注釈とは異なり、プロパティの型を指定せず、ざっくり「オブジェクトであること」を型注釈する方法もあります。object
型やObject
型、{}
型を使うものです。
ts
leta : object;letb :Object ;letc : {};
ts
leta : object;letb :Object ;letc : {};
これらはどれもオブジェクトの型の値ならどんなものでも代入可能になる型です。
ts
consta : object = {}; // OKconstb :Object = {}; // OKconstc : {} = {}; // OK
ts
consta : object = {}; // OKconstb :Object = {}; // OKconstc : {} = {}; // OK
object型、Object型、{}型の違い
object
型やObject
型、{}
型の3つは類似する部分がありますが、object
型と他の2つは異なる点があります。
object型
object
型はオブジェクトだけが代入できる型です。JavaScriptの値はプリミティブ型かオブジェクトの2つに大分されるので、object
型はプリミティブ型が代入できない型とも言えます。
ts
leta : object;a = {x : 1 }; // OKa = [1, 2, 3]; // OK。配列はオブジェクトa = /a-z/; // OK。正規表現はオブジェクト// プリミティブ型はNGType 'number' is not assignable to type 'object'.2322Type 'number' is not assignable to type 'object'.= 1; a Type 'boolean' is not assignable to type 'object'.2322Type 'boolean' is not assignable to type 'object'.= true; a Type 'string' is not assignable to type 'object'.2322Type 'string' is not assignable to type 'object'.= "string"; a
ts
leta : object;a = {x : 1 }; // OKa = [1, 2, 3]; // OK。配列はオブジェクトa = /a-z/; // OK。正規表現はオブジェクト// プリミティブ型はNGType 'number' is not assignable to type 'object'.2322Type 'number' is not assignable to type 'object'.= 1; a Type 'boolean' is not assignable to type 'object'.2322Type 'boolean' is not assignable to type 'object'.= true; a Type 'string' is not assignable to type 'object'.2322Type 'string' is not assignable to type 'object'.= "string"; a
📄️ プリミティブ以外はすべてオブジェクト
JavaScriptでは、プリミティブ型以外のものはすべてオブジェクトです。オブジェクトには、クラスから作ったインスタンスだけでなく、クラスそのものや配列、正規表現もあります。
Object型
Object
型はインターフェースです。valueOf
などのプロパティを持つ値なら何でも代入できます。したがって、Object
型にはnull
やundefined
を除くあらゆるプリミティブ型も代入できます。string型やnumber型などのプリミティブ型は自動ボックス化により、オブジェクトのようにプロパティを持てるからです。
ts
leta :Object ;a = {}; // OK// ボックス化可能なプリミティブ型OKa = 1; // OKa = true; // OKa = "string"; // OK// nullとundefinedはNGType 'null' is not assignable to type 'Object'.2322Type 'null' is not assignable to type 'Object'.= null; a Type 'undefined' is not assignable to type 'Object'.2322Type 'undefined' is not assignable to type 'Object'.= a undefined ;
ts
leta :Object ;a = {}; // OK// ボックス化可能なプリミティブ型OKa = 1; // OKa = true; // OKa = "string"; // OK// nullとundefinedはNGType 'null' is not assignable to type 'Object'.2322Type 'null' is not assignable to type 'Object'.= null; a Type 'undefined' is not assignable to type 'Object'.2322Type 'undefined' is not assignable to type 'Object'.= a undefined ;
📄️ ボックス化
多くの言語では、プリミティブは一般的にフィールドやメソッドを持ちません。プリミティブをオブジェクトのように扱うには、プリミティブをオブジェクトに変換する必要があります。プリミティブからオブジェクトへの変換をボックス化(boxing)と言います。
Object
型はTypeScriptの公式ドキュメントで使うべきでないとされています。理由はプリミティブ型も代入できてしまうためです。もしオブジェクトならなんでも代入可にしたい場合は、代わりにobject
型を検討すべきです。
{}型
{}型
は、プロパティを持たないオブジェクトを表す型です。プロパティを持ちうる値なら何でも代入できます。この点はObject
型と似ていて、null
やundefined
を除くあらゆる型を代入できます。
ts
leta : {};a = {}; // OK// ボックス化可能なプリミティブ型OKa = 1; // OKa = true; // OKa = "string"; // OK// nullとundefinedはNGType 'null' is not assignable to type '{}'.2322Type 'null' is not assignable to type '{}'.= null; a Type 'undefined' is not assignable to type '{}'.2322Type 'undefined' is not assignable to type '{}'.= a undefined ;
ts
leta : {};a = {}; // OK// ボックス化可能なプリミティブ型OKa = 1; // OKa = true; // OKa = "string"; // OK// nullとundefinedはNGType 'null' is not assignable to type '{}'.2322Type 'null' is not assignable to type '{}'.= null; a Type 'undefined' is not assignable to type '{}'.2322Type 'undefined' is not assignable to type '{}'.= a undefined ;
object型、Object型、{}型の代入範囲
object
型やObject
型、{}
型の代入範囲をまとめると次の図のようになります。
学びをシェアする
TypeScriptにはよく似た型にobject、Object、{}がある。どれも「オブジェクト」を指す型。
✅object、Object、{}の違い
1️⃣object型: オブジェクトのみ代入可能
2️⃣Object型、{}型: オブジェクトとnull、undefinedを除くプリミティブ型が代入可能
『サバイバルTypeScript』より