TypeScript特集第三回目です.
今回は, 本当にTypeScriptが静的で型安全なのかどうかを確認してみます.
今回見ていくコードは, 以下のコードです.
[javascript] class sample1{ private privateStr: string = "private"; public publicStr: string = "public"; constructor(); constructor() { } public hello(): string { return '<h1>' + 'helloworld' + '</h1>'; } } class sample2 { constructor(); constructor() { } public sample(): void { var sample = new sample1(); var str1 = sample.privateStr; var str2 = sample.publicStr; } public numToStr(): void { var str : string = "hoge"; var num : number = 20; str = num; } public strToNum(){ var str = "hoge"; var num = 20; num = str; } public returnNum(): number { var str: string = "hogehoge"; return str; } } [/javascript]
ちなみにsample2クラスは, すべての関数にエラーが出ています.
まず, コンストラクタから見ていきましょう.
[javascript] public sample(): void { var sample = new sample1(); var str1 = sample.privateStr; var str2 = sample.publicStr; } [/javascript]
ここでは, sample1クラスのprivateStrとpublicStrをそれぞれ取得しようとしています.
通常のJavaScriptならば, 厳格にpublic, privateを制御するにもある程度テクニックが必要ですが, TypeScriptでは, privateStrの部分でアクセス不可のエラーが返されコンパイルが通りません.
次にnumToStr関数を見てみましょう
[javascript] public numToStr(): void { var str : string = "hoge"; var num : number = 20; str = num; } [/javascript]
これは, string型のstrにnumber型のnumを代入しようとしています.
JavaScriptならば, 当然代入しても文句は言われません.
しかし, TypeScriptでこのコードを実装するとnumberをstringに変換できませんとエラーが返されます.
次に, このnumToStrのコードから明示的な型の指定を外したstrToNumを見てみます.
[javascript] public strToNum(){ var str = "hoge"; var num = 20; num = str; } [/javascript]
この関数では, 明示的に型を指定していませんが, numに対してstrを代入する部分でまたしてもstringをnumberに変換できませんのエラーが返されます.
これは, TypeScriptのコンパイラがしっかり型チェックをしてくれているおかげです.
最後に, returnNum関数を見てみましょう.
[javascript] public returnNum(): number { var str: string = "hogehoge"; return str; } [/javascript]
この関数は, 返り値にnumber型を指定していますが, 返却時にstring型を返却しようとしています.
またしてもJavaScriptならば当たり前のように動きますが, TypeScriptでは, コンパイラがしっかりチェックしてくれるので エラーが返されます.
実際のところこのコードに近いものは, JavaScriptでは, 当たり前のように動いてしまいますがはっきりってバグの温床にならないほうがおかしいレベルのコードです.
その部分をTypeScriptでは, あらかじめコンパイラ側のチェックでうまく弾いてくれるため, より安全なコードを書くことができるようになります.