簡単な関数をCLIで作ってみよう
JavaScriptからTypeScriptへのマイグレーションは想像以上に簡単なこと、コンパイラが生成するJSコードがどんなものなのか、コンパイラがあることのメリットを体感してもらう

JavaScriptで発生しうる問題

JavaScriptで次のような関数があったとします。
1
function increment(num) {
2
return num + 1;
3
}
4
5
console.log(increment(1));
Copied!
ただの引数をインクリメントして返すだけのその名もincrementです。
上記を実行します。 実行時のファイル名をincrement.jsとしていますが、異なる名前にした方は読みかえてください。
1
$ node increment.js
2
2
Copied!
予想どおりのなんでもない関数ですが、この関数が次のように呼ばれたらどうでしょうか。
1
function increment(num) {
2
return num + 1;
3
}
4
5
console.log(increment('1'));
Copied!
呼び出し時の引数1'1'になりました。これだけでこの関数の結果は大きく変わってしまいます。
1
$ node increment.js
2
11
Copied!
これは算術演算子の+(加算)を期待してこの関数を作ったと思われるところに文字列が入ってしまったため+が文字列連結として解釈されてしまったことが原因です。 もしこれが金額の計算だったとしたら大変なことになります。
TypeScriptを使うと、コーディングの時点でこのような型の不一致による意図しない挙動を抑えられるようになります。

JavaScriptをTypeScriptに変換する

ファイル名の変更は拡張子を.jsから.ts に変更するだけです。
1
$ mv increment.js increment.ts
Copied!
これをエディターで開くとincrement()の引数にあたるnumのところで何か言われます。
1
Parameter 'num' implicitly has an 'any' type, ...
Copied!
これはTypeScriptはこの引数に対していかなる型も与えられていないよ(いわゆるany)ということを言っています。そこで型を付加します。付加する型はnumber型です。
1
function increment(num: number) {
2
return num + 1;
3
}
4
5
console.log(increment('1'));
Copied!
すると今度は呼び出し側でTypeScriptコンパイラからメッセージが表示されます。
1
Argument of type '"1"' is not assignable to parameter of type 'number'.`
Copied!
このメッセージの意味は「この引数の'1'number型ではないよ」という至極まっとうな指摘です。
ひとまずこの警告を完全無視してコンパイルをしてみます。
1
$ tsc increment.ts
Copied!
やはり警告が出てしまいます。
1
Argument of type '"1"' is not assignable to parameter of type 'number'.
2
3
console.log(increment('1'));
4
~~~
5
Found 1 error.
Copied!
このように事前にコードに潜んでいる危険を、コーディングまたはコンパイルの時点で検知できます。

戻り値にも型を書く

今回は引数のみの紹介となりましたが、戻り値にも型を指定することができます。これによりその関数内で意図しない結果を返さないかどうかの検知に使うことができます。
戻り値も書いたincrement.tsの完全版は次のようになります。
1
function increment(num: number): number {
2
return num + 1;
3
}
Copied!
もちろん、この関数で戻り値をstring型などnumber型ではない型に設定するとTypeScriptから指摘を受けます。
1
Type 'number' is not assignable to type 'string'.
2
3
return num + 1;
4
~~~~~~~~~~~~~~~
Copied!
最終更新 11d ago