TypeScript 基本型

処理の流れ

以下が大まかな処理の流れ。まず1~3はTSにおける処理。4~6はJSにおける処理。

  1. TypeScriptソース→TypeScript AST

  2. ASTが型チェッカーによってチェックされる

  3. TypeScript AST→JavaScriptソース

  4. JavaScriptソース→JavaScript AST

  5. AST→バイトコード

  6. バイトコードがランタイムによって評価される。

ラインタイムに関する理解が曖昧なので、また別の機会でまとめてみようと思う。

型の種類

型の基本的な型を軽く紹介する。

any

どんな型でも取るもの。プログラマが型がわからない時に使う最後の手段の型。できるだけ避けたい。 TSCはデフォルトだとanyに対してエラーを出さないけど、tsconfig.jsonの中でnoImplicitAnyフラグを有効にすることでエラーを出すようになる。TSCフラグのstrictを有効にしている場合も、エラーを出す。

unknown

anyと同様に任意の型を示すが、それが何の型かがわかるまで値の使用を許可しない。以下が具体例。

let a: unknown = 30;        // unknow
let b = a == 50;            // boolean
let c = a + 10;           // エラー TS2571:オブジェクトの型は'unknown'です

boolean

普通はbooleanはTSC型推論させることが多い。また以下のようなリテラル型で型アノテーションすることも可能。

let e: true = true  // true
let f: false = true  // エラー

number

整数、浮動小数点数、正数、負数、Infinity, NaNなど全ての数値を表す。当然この型もリテラル型として宣言することもできる。

bigint

numberの表せる整数は253までだが、bigintはそれよりも大きな整数も表すことができる。まだ全てのJavaScriptエンジンではサポートされていないよう。

string

連結、スライスなど様々なことができる。

symbol

オブジェクトやマップにおいて文字キーの代わりとして既知のキーが適切に使われ、確実に誤った値が設定されたくない場合に用いられる。シンボルは固有であることが保証されている。以下の例を参照。

let Sym1 = Symbol("Sym")
let Sym2 = Symbol("Sym")

console.log(Sym1 === Sym2) // false

object

オブジェクトの形状を指定する。基本的にはobjectと明示的に型付けしない。

let a: {
    b: number
    c?: string
    [key: number]: boolean // [key: T]はインデックスシグネチャ。Tはnumberかstring
}

a = {b: 1, 10: true, 20: false}

終わりに

まずは基本的な型について紹介した。型エイリアス、配列などより応用的な型システムについてはまた紹介します。

参照

O'REILY プログラミング TypeScript