TypeScript型推論

概要:このチュートリアルでは、TypeScriptの型推論について学習します。

型推論とは、明示的に型注釈を付けなくても、TypeScriptがどのように型を推測するか、そしてどこで推測するかを説明するものです。

基本的な型推論

変数を宣言する際に、型注釈を使用して明示的に型を指定できます。例:

let counter: number;Code language: JavaScript (javascript)

しかし、`counter`変数を数値で初期化すると、TypeScriptは`counter`の型を`number`として推論します。例:

let counter = 0;Code language: JavaScript (javascript)

これは次のステートメントと同等です。

let counter: number = 0;Code language: JavaScript (javascript)

同様に、関数パラメータに値を代入すると、TypeScriptはパラメータの型をデフォルト値の型として推論します。例:

function setCounter(max=100) {
    // ...
}Code language: JavaScript (javascript)

この例では、TypeScriptは`max`パラメータの型を`number`として推論します。

同様に、TypeScriptは`increment()`関数の戻り値の型を`number`として推論します。

function increment(counter: number) {
    return counter++;
}Code language: JavaScript (javascript)

これは次のものと同じです。

function increment(counter: number) : number {
    return counter++;
}Code language: JavaScript (javascript)

最適な共通型アルゴリズム

次の代入を考えてみましょう。

let items = [1, 2, 3, null];Code language: JavaScript (javascript)

`items`変数の型を推論するために、TypeScriptは配列内の各要素の型を考慮する必要があります。

TypeScriptは最適な共通型アルゴリズムを使用して、各候補型を分析し、他のすべての候補と互換性のある型を選択します。

この場合、TypeScriptは、数値またはnullの配列型(`number | null)[]`)を最適な共通型として選択します。`|`は型におけるOR演算子であることに注意してください。

`items`配列に文字列を追加すると、TypeScriptは`items`の型を数値と文字列の配列`(number | string)[]`として推論します。

let items = [1, 2, 3, 'Cheese'];Code language: JavaScript (javascript)

コンテキスト型

TypeScriptは、変数の位置を使用して型を推論します。このメカニズムはコンテキスト型として知られています。例:

document.addEventListener('click', function (event) {
    console.log(event.button); 
});Code language: JavaScript (javascript)

この例では、TypeScriptは`click`イベントのため、`event`パラメータが`MouseEvent`のインスタンスであることを認識しています。

しかし、`click`イベントを`scroll`イベントに変更すると、TypeScriptはエラーを発生させます。

document.addEventListener('scroll', function (event) {
    console.log(event.button); // compile error
});Code language: JavaScript (javascript)

エラー

Property 'button' does not exist on type 'Event'.(2339)Code language: JavaScript (javascript)

TypeScriptはこの場合の`event`は`MouseEvent`ではなく`UIEvent`のインスタンスであることを認識しています。そして`UIEvent`には`button`プロパティがないため、TypeScriptはエラーをスローします。

コンテキスト型は、関数呼び出しの引数、型アサーション、オブジェクトのメンバと配列リテラル、戻り値、代入の右辺など、多くの場合に見られます。

型推論と型注釈

以下は、型推論と型注釈の違いを示しています。

型推論型注釈
TypeScriptが型を推測します。明示的にTypeScriptに型を指示します。

では、型推論と型注釈をいつ使用すべきでしょうか?

実際には、できる限り常に型推論を使用する必要があります。型注釈は次の場合に使用します。

  • 変数を宣言し、後で値を代入する場合。
  • 推論できない変数が必要な場合。
  • 関数が`any`型を返す場合、値を明確にする必要があります。

まとめ

  • 型推論は、変数を初期化したり、パラメータのデフォルト値を設定したり、関数の戻り値の型を決定したりするときに発生します。
  • TypeScriptは最適な共通型アルゴリズムを使用して、すべての変数と互換性のある最適な候補型を選択します。
  • TypeScriptは、変数の位置に基づいて変数の型を推論するために、コンテキスト型も使用します。
このチュートリアルは役に立ちましたか?