TypeScript 基本型
処理の流れ
以下が大まかな処理の流れ。まず1~3はTSにおける処理。4~6はJSにおける処理。
TypeScriptソース→TypeScript AST
ASTが型チェッカーによってチェックされる
TypeScript AST→JavaScriptソース
JavaScriptソース→JavaScript AST
AST→バイトコード
バイトコードがランタイムによって評価される。
ラインタイムに関する理解が曖昧なので、また別の機会でまとめてみようと思う。
型の種類
型の基本的な型を軽く紹介する。
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