「JavaScriptの書き方」でJavaScriptを覚えました。小さいうちは快適です。ところが規模が増えてくると、「動かして初めて間違いに気づく」ことが増えてきます。
そのつらさを解消するのが TypeScript です。前回のSassと同じく、まず「なぜ必要になるのか」から始めます。実際、この2つは驚くほど同じ形をしています。
1. 実行するまで間違いに気づけない
ピュアなJavaScriptには、こんな落とし穴があります。
function priceWithTax(price) {
return price * 1.1;
}
priceWithTax("1000"); // 文字列を渡してしまった
これはエラーになりません。JavaScriptは気を利かせて計算を続け、1100.0000000000002 のような値を返します。間違いに気づくのは、だいぶあとになってからです。
もっとよくあるのがこれです。
const user = getUser();
console.log(user.name); // TypeError: Cannot read properties of undefined
getUser() が何も返さない場合があることを、書いている時点では誰も教えてくれません。動かして初めて分かります。
- 変数に何が入っているか(文字列なのか数値なのか)を、誰も保証してくれない
- 関数に渡す引数を間違えても、動かすまで気づけない
- 名前を打ち間違えても、実行するまで分からない
これを「書いている最中に気づけるようにしよう」というのがTypeScriptの発想です。
2. TypeScriptで何が変わるか
型注釈 ― 「この変数は文字列」「この関数は数値を返す」と明示できます。
function priceWithTax(price: number): number {
return price * 1.1;
}
priceWithTax("1000");
// ^^^^^^ 型 'string' の引数を型 'number' のパラメーターに割り当てられません
保存した瞬間、赤い波線で指摘されます。実行する前です。
型推論 ― いちいち全部に書く必要はありません。中身から推測してくれます。
const name = "ShigeNoKi"; // 書かなくても string だと分かっている
name.toUpperCase(); // OK
name.toFixed(2); // エラー。string に toFixed はない
インターフェース ― データの形に名前を付けて共有できます。
interface User {
id: number;
name: string;
email?: string; // ? は「無いこともある」
}
function greet(user: User) {
return `こんにちは、${user.name}さん`;
}
こう書いておくと、user.nama のような打ち間違いはその場で弾かれます。
エディタの補完が効く ― 実利としていちばん大きいのはこれです。型が分かっているので、user. と打った瞬間に使えるプロパティの一覧が出ます。ドキュメントを探しに行く回数が目に見えて減ります。
3. いちばん大事な一歩 ― ブラウザーはTypeScriptを読めない
ここが前回のSassとまったく同じ形です。ブラウザーはTypeScriptをそのまま理解できません。
ブラウザーが読めるのはJavaScriptだけです。そのため、書いたTypeScriptをコンパイルして普通のJavaScriptに変換してから配ります。
main.ts (書く用のファイル)
↓ コンパイル
main.js (配る用のファイル。サーバーに置くのはこちら)
前回の図と見比べてみてください。
| 書く用 | 配る用 | |
|---|---|---|
| Sass | style.scss |
style.css |
| TypeScript | main.ts |
main.js |
やっていることは同じです。書きやすい形で書き、ブラウザーが読める形に変換してから配る。この形が分かれば、新しい道具が出てきても「これはどちら側のファイルなのか」で位置づけられます。
ちなみに、変換の過程で型注釈は消えます。型はあくまで書いている人間と道具のためのもので、出来上がったJavaScriptには残りません。
4. この型は、サーバー側でも効く
最後に橋を1本架けておきます。
ここまでTypeScriptを「ブラウザーで動くJavaScriptを書きやすくするもの」として説明してきました。ですが実は、TypeScriptはサーバー側(バックエンド)でもそのまま使えます。
「フロントエンドとバックエンドは何が違うのか」で、違いは動く場所だけだと書きました。言語そのものに表と裏の区別はないので、JavaScriptもTypeScriptもサーバーの中で動かせます。
つまり、フロント側で覚えた道具立てが、そのままバックエンドでも効くということです。同じ言語で、同じ型の書き方で、画面もサーバーも書ける。ここがJavaScriptという言語のいちばん強いところです。
まとめ
- ピュアなJavaScriptは「実行するまで間違いに気づけない」。
- TypeScriptは型注釈・型推論・インターフェースで、それを書いている最中に気づけるようにする。
- ブラウザーはTypeScriptを読めないので、コンパイルしてJavaScriptにしてから配る(Sassと同じ形)。
- TypeScriptはサーバー側でも書ける。
- 前提となる記事:「JavaScriptの書き方」
- 同じ「変換してから配る」形:「CSSをそのまま書くのがつらくなったら(Sass)」
- 動く場所の話:「フロントエンドとバックエンドは何が違うのか」