TypeScriptの型は、変数がどんな種類の値を持てるかを表します。型はコロンのあとに let name: string のように書き、コンパイラーは違う種類の値を入れるコードをエラーにします。基本の型は、JavaScriptの7つのプリミティブと、配列やオブジェクトを表すオブジェクト型です。
型注釈はコンパイル時にチェックされ、そのあと取り除かれます。実際に動くプログラムはただのJavaScriptです。
プリミティブ型
| 型 | 値の例 | 補足 |
|---|---|---|
string | "hi", 'hi', `hi ${name}` | テキスト。3種類の引用符はどれも同じ型です。 |
number | 42, 3.14, -0.5, NaN, Infinity | 整数も小数もすべての数値。int や float はありません。 |
boolean | true, false | この2つの値だけです。 |
bigint | 10n, BigInt(10) | 任意の大きさの整数。target が ES2020 以降である必要があります。 |
symbol | Symbol("id") | 一意な値。主にオブジェクトのキーとして使います。 |
null | null | 「意図的に空」。 |
undefined | undefined | 「未設定」。存在しないプロパティを読んだときの値でもあります。 |
型名は小文字です。実行時の typeof もほとんどの型で同じ単語を返すので、プログラムの実行中に値のプリミティブ型を調べるには typeof x === "number" のように書きます。
型注釈
型注釈は、変数、パラメーター、関数のパラメーターリストのあとに書く : Type です。いちばん重要なのはパラメーターです。呼び出し側が何を渡すかをTypeScriptは推測できないからです。
変数を同じ行で初期化する場合、型注釈はたいてい不要です。let count = 10 はすでに number 型になっています。型を省略するときのルールは型推論のページで説明しています。
型が違えばコンパイルエラー
違う型の値を代入すると、何かが実行される前にコンパイラーが止めます:
コンパイラーの出力:
index.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'.
直し方は、port = Number("3000") のように値を変換するか、その変数が本当にテキストを持つべきなら型注釈を変えることです。
number: 整数型はない
JavaScriptはすべての数値を64ビット浮動小数点数で保持するため、TypeScriptの数値型は number ひとつだけです。整数は Number.MAX_SAFE_INTEGER(2 ** 53 - 1)までは正確に表せます。それを超える場合は bigint を使います。
bigint と number は混ぜられません。exact + 1 はコンパイルエラー(TS2365: Operator '+' cannot be applied to types 'bigint' and '1'.、'1' は 1 のリテラル型)になり、仮に実行されたとしても実行時に TypeError になります。BigInt(1) や Number(exact) でどちらかを明示的に変換してください。ただし Number は安全な範囲を超えた値を丸めます。
整数だけを受け付ける型は、任意の値についてはTypeScriptでは表現できません。値がプログラムに入ってくる場所で Number.isInteger を使って検証します。
boolean
boolean の値は true と false の2つだけです。真とみなされるだけの値(1、"yes")は boolean ではないので、Boolean(x) や x !== 0 で boolean に変換します。
null と undefined
strict が有効な場合(TypeScript 6.0 からはデフォルト)、null と undefined は独立した型で、string や number などほかの型には含まれません。空になりうる変数はユニオン型でそれを明示します:
undefined かもしれない値のプロパティを読むと、チェックするまではコンパイルエラーになります。チェックの方法、?.、?? については null と undefined のページで説明しています。
配列とオブジェクトの概要
プリミティブ以外はすべてオブジェクト型です。最初に出会うのは次の3つの形です:
let tags: string[] = ["ts", "js"]; // array of strings
let point: { x: number; y: number } = { x: 1, y: 2 }; // object with two number properties
let greet: (name: string) => string = (n) => `hi ${n}`; // function type
それぞれに専用のページがあります: 配列、タプル(長さが決まった配列)、オブジェクト型、関数型。
string, number, boolean と String, Number, Boolean
大文字の名前は、普通の値ではなくJavaScriptのラッパーオブジェクト(new String("x"))の型です。型注釈には小文字の名前を使います。
index.ts(3,7): error TS2322: Type 'String' is not assignable to type 'string'.
'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible.
1行目の String を string に変えればこのブロックは実行できます。Number、Boolean、Symbol、BigInt も同じです。(Object は別で、プリミティブを含むほぼすべての値を受け付けます。オブジェクト型のページを参照してください。)
そのほかの組み込み型
早い段階で出てくる型がほかにもいくつかあります。それぞれ専用のページがあります。
| 型 | 意味 |
|---|---|
any | その値のチェックを無効にします。使わないようにしましょう。 |
unknown | どんな値でもよいが、使う前にチェックが必要です。 |
void | 関数が意味のある値を返しません。 |
never | 値がまったくない型: 必ず例外を投げる関数や、ありえないケース。 |
object | プリミティブ以外のすべての値。 |
"red" | "green" | リテラル型: この値だけを受け付けます。 |
よくある質問
TypeScriptに整数型はありますか?
ありません。JavaScriptはすべての数値を64ビット浮動小数点数で保持するため、number が整数も小数もまとめて表します。整数かどうかは実行時に Number.isInteger(n) で確認し、Number.MAX_SAFE_INTEGER(2 ** 53 - 1)を超える整数を精度を落とさずに扱いたいときは bigint(10n)を使います。
TypeScriptの string と String の違いは何ですか?
string はプリミティブ型で、文字列リテラルやテンプレート文字列の型です。String は new String("x") で作るラッパーオブジェクトの型です。型注釈には常に小文字の string、number、boolean を使います。String を string に代入するとコンパイルエラー(TS2322)になります。
TypeScriptのプリミティブ型には何がありますか?
JavaScriptと同じ7つです: string、number、boolean、bigint、symbol、null、undefined。それ以外(配列、オブジェクト、関数、クラスのインスタンス)はすべてオブジェクト型です。
TypeScriptで型を指定して変数を宣言するには?
名前のあとにコロンと型を書きます: let count: number = 0;。関数では各パラメーターに型を付け、必要なら戻り値の型も書きます: function add(a: number, b: number): number。変数を初期化する場合は、たいてい型注釈を省略してTypeScriptに推論させられます。
TypeScriptの型は実行時にも存在しますか?
存在しません。コンパイラーは型をチェックしたあとに取り除くので、実行されるJavaScriptには型注釈がありません。実行時に値を調べるには typeof、Array.isArray、instanceof などのJavaScriptの演算子を使います。