先週の金曜(2018-01-12)に、「TypeScript、お前もか: nullやundefinedの扱いがイイカゲン過ぎ」という記事(後にタイトルに「【事実誤認あり】」を追加)を書いたのですが、ほぼ言いがかりでした。謝罪と修正は「TypeScript、僕が悪かった、ゴメン: nullやundefinedの扱いはマトモだった」に書いてあります。
申し訳ないことをしたので、TypeScriptに関してポジティブな話を書きます。そもそも僕はTypeScript好きなんですよ。文句を付けた記事の書き出しは、
- TypeScriptには期待してたんだけど、ガッカリだよ。
ですが、第二の文は、
- それでもまー、割と好きだけど。
本文中にも、
- nullやundefinedに関しても、整合的で安全なセマンティクスをかぶせているだろう、と。「期待していた」というより、思い込んでいた、信じていたのです。
と、信頼を寄せていた心情が伝わるでしょ。早とちりで「信じていたのに裏切られた」と誤解してカッとなったのですけど。
さて、TypeScriptはJavaScript+αなのですが、もとが極めてポピュラーなJavaScriptであって、+αの機能も持っていることから、現状において、サンプルコードを書くには最良の言語だと思います。
僕は、かなり昔から「サンプルコードはJavaScriptで書こう」と決めていました。2006年1月21日に書いた次の短い記事でそう表明しています。
当時の状況も書いてあったりして、懐かしい気分になります。
実を言えば、このあいだまでJavaScriptは「なんかトンデモない言語仕様の、ひどく貧弱な言語」-- みにくいアヒルの子と捉えていたのですが、りっぱな白鳥に、でも灰色の斑点が少し残った白鳥に成長しそうですね。
という見通しはだいたい当たったようです。
「サンプルをJavaScriptで書こう」と決めた第一の理由は、「誰でもどこでも使える」ことです。サンプルを試してみるのに、処理系のインストールやセットアップは不要です。ブラウザさえあればOK、最近のメジャーブラウザは[F12]でJavaScriptコンソールが使えます。そして、言語仕様も多くの人が知るところです。
JavaScriptは、無節操な(よく言えばマルチパラダイムな)言語なので、他の言語の書き方を真似しやすいのもいいですね。どんなスタイルのコードを書いても「JavaScriptはカクカクシカジカだから、その書き方はよくない」なんて話は(滅多に)出ません、もとが無節操だから。
ただ、型が書けないのはやはり辛い。例えば、
function isEmptyString(s) { return s.length == 0; }
この例では、関数名が「引数は文字列だ」と強く暗示してますが、もっと素っ気なく、
function e(s) { return s.length == 0; }
これだと、「引数は文字列だ」は伝わりにくいでしょう。ドキュメンテーションと型チェックを入れるなら、
function e(s/* string */) /* returns boolean */{ if (typeof s != 'string' && !(s instanceof String)) { throw "Bad Arg"; } return s.length == 0; }
なんだか、みにくくなってしまいます。
TypeScriptなら、
function e(s : string) : boolean { return s.length == 0; }
スッキリ書けます。
ただし、TypeScript言語処理系のインストールが必要なので、「誰でもどこでも使える」メリットは失われてしまいます。これはトレードオフなので致し方ないですけど。救いはインストールが比較的簡単なことです。node.jsとnpmのエコシステムはよく整備されていて、node.jsさえインストールしてしまえば、TypeScriptや関連ツール/ライブラリはnpm(最近ならyarnか)でインストールできます。
型がないと、説明とサンプルを書くことが困難なことがあります。2008年1月16日に書いた記事「CPS(継続渡し方式)変換をJavaScriptで説明してみるべ、ナーニ、たいしたことねーべよ」では、型パラメータが必要でした。この記事の第1節「未来のJavaScript」で、次のようなコードが書ける疑似言語を仮定しています。
function<X, Y> makePair(first:X, second:Y):Array2<X, Y> { return [first, second]; }
架空の言語の代わりに、実在するTypeScriptを使って型パラメータを使った話題を書けるようになりました。
JavaScriptだけで済む話なら、「誰でもどこでも使える」JavaScriptが望ましいでしょう。ですが、型が必須の話題/サンプルはTypeScriptを使うのが現状では最善だと思います。