Programming Field

object - TypeScriptキーワード一覧

スポンサーリンク

「object」は「オブジェクト型」を表す型名として用いられます。他の基本型とは混ざらない型として用いられます。

TypeScript 2.2 で導入されています。

概要

(特筆の無いものは 「TypeScript Issue #1809: Suggestion: The `object` primitive type」での説明によります。)

キーワード情報

詳細

「object 型」は通常は「オブジェクト型」として扱われますが、それと同時に「プリミティブ型ではない」すなわち「numberstringsymbol などの基本型ではない」ことを明確に示す型になります。「Object 型」の変数には数値やboolean値などを代入できるのに対し、「object 型」の変数には代入できずエラーとなります。

let x: object;             // object 型変数
let y: Object;             // Object 型変数
x = { data: 10 };          // オブジェクトデータを代入
x = 'hello text';          // ERROR: TS2322: 文字列は object 型に割り当てられない
y = 'hello text';          // 文字列は Object 型には割り当て可能
y = x;                     // object 型は「{ }」型と同等、「{ }」は他にフィールドを持たないために
                           // 「Object」型と同等なので、Object 型に object 型データを割り当て可能

なお、Function 型自身が厳密に Object の部分型(派生型)となっているため(ES2015の仕様、Function.prototype[[Prototype]]%ObjectPrototype%)、関数型のデータは object 型の変数に代入可能です。また、型ガードで object 型に対して関数かどうかの判定をすると、そのガード下では never とならず関数として利用できます。

let obj: object;    // object 型変数
.
.
.
if (typeof obj === 'function') {
    // このブロックでは obj を関数(Function 型)として扱える
    obj();
}

ただし、「null」値typeof の結果が "object" になるため、「strictNullCheck」のオプションが有効である場合、「typeof x === "object"」という型ガードでは「null 型」が入る可能性があります。

// (「strictNullCheck」が有効である場合)

let obj: object | null | undefined;  // Nullable な object 型変数
.
.
.
if (typeof obj === 'object') {
    // このブロックで obj は「object | null」型となり、依然として Nullable となる
    // (undefined は typeof が 'undefined' なのでそれは取り除かれる)
    console.log(obj.toString());     // ERROR: TS2531: obj が null の可能性がある
}

object 型データの利用

「object 型」のデータは「プリミティブ型ではない Object 型」以上の情報を持たず、「any」の意味を持つわけでもないため、通常利用することは稀です。多くの場合、「interface」などで定義されたより具体的な型を指定するか、「任意の型を利用したい」という意味で any 型を用いることが多いと考えられます。

object 型は「プリミティブ型ではない」ということを用いて、typeof の結果が "object" (および "function")であることを期待したい箇所で利用することができます。例として、プリミティブ型は任意のプロパティー(フィールド)を動的に追加することができない(ES2015の仕様)ので、引数に対してそのような処理を行う関数では、その引数の型を「object」とすることで、意図せずプリミティブ型のデータが渡されることを防ぐことができます。

// オブジェクトに対してプロパティー追加を伴う何かしらの加工を行う関数
function writeMarker(obj: object) {
    // object 型そのものはほとんどのプロパティーを持たない型になるので、
    // 独自のプロパティーを入れる場合は any に変換して型チェックを省略するようにする
    (obj as any)['.$marker'] = true;
}

let o1 = {};
writeMarker(o1);        // OK
let o2: number = 10;
writeMarker(o2);        // ERROR: TS2345: number 型は object 型に割り当てられない