Revised Revised 型の国のTypeScript

本書について

本書はJavaScriptにコンパイル可能な言語のTypeScriptについて解説した本です。TypeScriptの基本的な知識(型の使い方)やコンパイラのオプション、型定義ファイルの作り方やエコシステムについて解説します。

対象読者は新しめのJavaScript、いわゆるECMAScript 2015とそれ以降*1について理解しているユーザです。Node.js環境やnpmの使い方、OOP (Object Oriented Programming)の効能や利点をある程度理解していることが望ましいです。

[*1] @azu_reさんと@laco0416くんが書いている入門書(書きかけ)があります https://github.com/asciidwango/js-primer

本書に登場するすべてのサンプルコードは次のTypeScriptコンパイラでコンパイルできることを確認しています。

Version 2.4.2

本書はC87、C90で頒布した『型の国のTypeScript』の改訂(C92)版です。あなたが読んでいるこの文章はC92で頒布されたRevised Revised TypeScript in Definitelylandの全文です。

前回頒布した時のTypeScriptは2.0.0でした。TypeScriptは進歩を続け、ますます堅牢で安全で、そして最新のECMAScript仕様が使えるようになっています。「よりよいJavaScriptコード」を書くことで型の絞込が行われ、nullundefinedのチェックができます。つまり、型に関する記法を覚え、JavaScriptとしてよいコードを書き、コンパイルできれば実行時エラーが発生する心配をほぼしなくてもよい環境が手に入ります。

今回の改訂では方針を変更し、TypeScriptについての網羅的な解説から知識の効率的な摂取にシフトすることにしました。というのも、TypeScript本体に重箱の隅をフォローする仕様が増え、網羅的に仕様を把握・解説することが困難になり、読むのも苦痛だろうからです。ECMAScript 2015以降の知識についての詳細は、本書では扱いません。主に型周りの説明、TypeScriptコンパイラ自体の説明、周辺仕様を解説します。

本書の内容はWebサイト*2にて全文を公開しています。誤字や内容の誤り、自分としてはコンパイルが通ると思うのに通らないパターン、深く掘り下げてほしい内容などがある場合、本書リポジトリまでIssue*3として報告していただけますと幸いです。

無料配布版では、表紙データなどは含まれないため可愛い表紙の冊子が欲しい場合はぜひ紙版をお買い上げください。

C87冊子版の表紙はイラスト:Jecyさん(http://jecy.main.jp/)、デザイン:shatiさん(http://utata-ne.net/)です。この表紙のおかげで書名が決まりました。可愛い表紙を本当にありがとうございます!

C90冊子版の表紙はイラスト:shatiさん(http://utata-ne.net/)、デザイン:siosioさんです。C87版から上手に味わいを引き継いだ可愛い表紙をありがとうございます!

C92冊子版の表紙はイラスト:Jecyさん(http://jecy.main.jp/)、デザイン:siosioさんです。筆者がケモ好きということが周知されてきた気配を感じます。1版から数えてもう2年半も経つんですね。可愛いけも耳をありがとうございます!

本書の内容

本書は--strictを有効にした状態を基本として解説します。オプションの詳細については第5章「オプションを知り己のコードを知れば百戦危うからず」を参照してください。

またNode.js、ブラウザを問わずモジュールの仕組みを使います。これはブラウザでの実行にはwebpack*4などのbundlingツールを使う前提であることを意味します。targetの指定はInternet Explorer 11でもes5指定で十分なためes5以上とし、es3については本書では考慮しません。また、必要があれば--downlevelIterationも利用します。

TypeScriptはJSXのサポートを含みますが、筆者が今のところJSXないしReactに興味がないため、本書では扱いません。興味がある方は公式のドキュメント*5を参照してください。

第1章「戦闘準備だ!TypeScript!」では、TypeScriptコンパイラのセットアップ方法とVisual Studio Codeの設定について言及します。

第2章「TypeScriptの基本」では基本構文を解説し、このあとの章を読み解くための基礎知識を蓄えます。

第3章「型は便利だ楽しいな」では開発する上で理解しておきたい型についての知識を蓄えます。

第4章「アドバンスド型戦略」では、TypeScriptで利用可能な型のちょっと難しいところ、利用頻度は低いが知っておくと嬉しいことについて解説します。

第5章「オプションを知り己のコードを知れば百戦危うからず」では、tscコマンドやtsconfig.jsonで利用できるオプションについて、重要なオプションを中心に解説します。

第6章「JavaScriptの資産と@types」では、@typesで用意されている型定義ファイルの使い方について解説します。

第7章「型定義ファイルを作成する」では、自分で型定義ファイルを書くための方法、さらにDefinitelyTypedへのコントリビュートの仕方について解説します。

第8章「ツールとしてのTypeScript」では、TypeScriptのLanguage Service APIやLanguage Server Protocolの概要を紹介します。

なぜTypeScriptを選ぶべきなのか

TypeScriptはMicrosoftが主導となって開発している言語で、ECMAScript(≒JavaScript)に静的な型付けによる検証を導入したものです。現実を見据えた言語仕様で、"未来のJavaScriptそのもの"になることを目指しています。

TypeScriptはECMAScriptのsuperset (上位互換)であることを標榜しています。つまり、ECMAScript+静的型付け=TypeScriptです。そして、"TypeScript独自の実装として表れる仕様"を注意深く避けようとしています。

TypeScriptのリポジトリには稀に「TypeScriptにLINQを導入してほしい」などのECMAScript仕様にない独自の要望が上がってきます。しかしながら、上記のポリシーを考えればそのような要望が取り込まれないのは明らかです。どうしてもTypeScriptに独自の仕様を入れたい場合、まずはECMAScript本体にその仕様を入れる努力が必要でしょう。

現代的で、よいJavaScriptコードを書くことは、よいTypeScriptコードを書くことに繋がります。そしてTypeScriptで得た知識やベストプラクティスは、JavaScriptを書く上でも正しい習慣を得るための補助輪として機能します。どちらか片方だけでは成り立たず、両輪を理解し活用することが上達への近道です。

さらにTypeScriptを勧めたい点として、TypeScriptコンパイラーが内蔵するエディタ支援のための機能群です。コンパイラに密に結合された(つまり更新遅延のない)エディタサポートは、強く信頼できる型推論や入力補完を提供します。高機能で信頼できる、曖昧さが排除されたエディタを使いたい場合、TypeScriptはうってつけの選択肢です。

これらTypeScriptの利点が支持された結果として、いくつかのフレームワークや多くの人々がTypeScriptを使い始めています。たとえばSlack*6、Reddit*7、Google*8、そしてTypeScript開発元であるMicrosoftなどのビッグサービスです。乗るしかない!このビッグウェーブに!

TypeScriptを選んだ時のデメリット

一番大きなデメリットは、JavaScriptにプラスした学習コストが発生します。JavaScriptの書き方に加え、TypeScriptで型注釈を与える記法を学ばねばなりません。

基本的な書き方はすぐに習得できますが、既存のJavaScriptライブラリと組み合わせようとしたときにTypeScriptに対する応用的な理解が必要になります。本書ではそのための専門知識について解説し、TypeScriptを自由自在に使いこなす手伝いをしていきます。

懸念として「TypeScriptにロックインされてしまうのでは?」という不安を耳にすることがあります。これについては脱出口が用意されています。TypeScriptできれいに書いたコードは--target esnextで出力すると、単に型注釈を取り除いただけの素直なJavaScriptが出力されます。簡単なコードを自分で書いてみて、それを変換して確認してみるとよいでしょう。まずは、恐れずにTypeScriptに取り組んでみましょう。