TypeScriptの行く先


どうもこんにちはわかめです。
この記事は[TypeScript Advent Calendar](http://qiita.com/advent-calendar/2014/typescript)の1日目の記事です。
なお、Advent Calendarはまだ6日ほど空きがあるので皆様よくわからないことを調べてみた！とか日々の生活で発見した小ネタとか読み応えのある超大作とかなんかで参加してください！よろしくお願いします！

初日というところで感動的な記事を書きたいところですが、11月末〆切の冬コミの原稿をｶﾞﾘｶﾞﾘ書いてたらSAN値までｶﾞﾘｶﾞﾘ行っちまって不定の狂気寸前でございます。さくさく書きましょう。

さて、今日は何故TypeScriptをやるべきかを語っていきたいと思います。

## 世界は型を求めている

今、世界は複雑さに対抗するために機械による検証という支援を多く必要としています。
JSXが、Haxeが、Dartが、AtScriptが、Flowが、TypeScript が型を求めています。
Google, Facebook, Microsoft という巨人達が型付きJavaScriptを求めているのです。
もはや、大規模開発に型による静的チェック無しなど、不可能に近い…と言えるでしょう。

## TypeScriptは現実

TypeScriptは現実、Dartは夢。これはLL Diverであんどうやすしさんと一緒に喋った(後に[mozaic.fm #8](http://mozaic.fm/post/96461640633/8-altjs)としてjxckニキにまとめられた)通りです。

Dartは現在のJavaScriptの世界に実行環境毎別れを告げ、DartVMという独自の処理系を作りブラウザに載せる事を目論んでいます。
Dartはなかなか良い言語で、是非JavaScriptを駆逐して流行ってほしいものだ、と思っています。
ですが、Googleが開発しているのでChromeには将来的に載るとしても、Chrome以外のブラウザに載るのは少なくともしばらくの間は難しいでしょう。

一方、ダサくても、辛くてもJavaScriptと共に歩もう！という現実路線がTypeScriptです。
TypeScriptはMicrosoftでアンダース・ヘルスバーグ御大が主導で開発している言語で、ECMAScript 5の上位互換となっています。
つまり、JavaScriptの上にわりと綺麗な型システムを構築した言語なわけです。
言語仕様も"付け足し"がベースであり、"変更"は含まれていません。

TypeScriptはECMAScript 5の上位互換なので、あまり大きくJavaScriptの構文を変えるようなことはしていません。
例えばCoffeeScriptが `==` の意味を改善したり、`hoge?.piyo` のようなnull安全な書き方を導入したような奴です。
TypeScriptでの `==` はJavaScriptと同じく自動的に型変換して比較しやがりますし、`typeof null` は相変わらず `"object"` を返します。
新しい構文(クラス定義の構文とか)が導入されてはいますが、それは来たるECMAScript 6の構文を踏襲するよう注意が払われているため、単に "未来の先取り" をしているだけと言ってしまってもよいでしょう。

つまり、TypeScriptは将来的に本当に "JavaScriptそのものに成る" という黄金色に輝く進路がありうるわけです。
妄想だって？失礼な！！(ぐるぐる目

## 他のTranspilerの動向

というのは妄想で、mozaic.fm #8の頃は「なるといいな〜ｗあははははｗｗ」という感じだったのですが、最近にわかにその未来予想が現実味を帯びてきました。

GoogleがAngularJS 2.0用に[AtScript](http://b.hatena.ne.jp/vvakame/AtScript)を、Facebookが[Flow](http://b.hatena.ne.jp/vvakame/flow)を発表し、両者ともTypeScriptの上位互換または互換性を持つことを標榜しはじめたのです。

### AtScript

AtScriptは、Google(というかAngularJS Team)がAngularJS 2.0のために作成する新言語です。
新言語というよりはいくつかの拡張を総称してAtScriptと呼ぶことにする、という感じでしょうか。

[AtScript Primer](https://docs.google.com/document/d/11YUzC-1d0V1-Q3V0fQ7KSit97HnZoKVygDxpWzEYW0U/edit), [AtScript "ES6 + A" Q&A](https://docs.google.com/document/d/1cUTD8oVzfpwFqX5tMxHTifKO8uJm5VddwmB0aVQMxpI/edit)

AtScript Primer より

> **Future of AtScript and TypeScript**
> Both of these languages are solving similar problems. The fundamental difference today is that TypeScript is based on ES5 and AtScript is explicitly based on ES6. Once TypeScript aligns with ES6, we intend to be a strict superset of TypeScript. We are collaborating with the TypeScript team on this effort.

ざっくりと要約すると "今のTypeScriptはES5ベースで、AtScriptはES6ベースなんだけど、TypeScriptが将来ES6ベースの仕様になったら完全上位互換目指すぜ！" らしいです。

これについてはMicrosoftでも公式に言及しています。
[TypeScript and the Road to 2.0](http://blogs.msdn.com/b/typescript/archive/2014/10/22/typescript-and-the-road-to-2-0.aspx)

また、GoogleとMicrosoftが協調して交流している様子もあります。
<blockquote class="twitter-tweet" lang="ja"><p>The <a href="https://twitter.com/typescriptlang">@typescriptlang</a> team visited Google today and we had a great chat. I&#39;m very excited about what&#39;s in store for JS!</p>&mdash; Dimitris Vardoulakis (@dimvar) <a href="https://twitter.com/dimvar/status/533097156568043520">2014, 11月 14</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

うーん、期待が持てる！

なお、AtScriptは +A (AはAnnotationを表す) と [RTTS](http://angular.github.io/assert/)(RunTime Type aSsertion…？なんの略かわからず) 

### Flow

FlowはFacebookが開発している新言語？です。
既に[公式サイト](http://flowtype.org/)があり、処理系も公開されています。
しかし、Flowは新言語というより、JavaScriptのlinterの延長線上にあるものと考えたほうがよいでしょう。
既に一回[Flowをチラ見した](http://qiita.com/vvakame/items/53a464681920e6c55b31)ログがあるので、詳しくはそちらを見てください。

[公式のComing soon](http://flowtype.org/docs/coming-soon.html)に、TypeScript用の型定義ファイルをFlow用に変換する機能が謳われています。

MSのブログでも、AtScriptと同列でFlowのチームとも交流がある旨が書かれています。
[TypeScript and the Road to 2.0](http://blogs.msdn.com/b/typescript/archive/2014/10/22/typescript-and-the-road-to-2-0.aspx)

その性質上、TypeScriptやAtScriptと同列で比較しないほうが良いでしょうが、心強い味方であることは確かです。

## TypeScriptとECMAScript 6

他チームと協調していく路線を打ち出した後、急速に進んでいます。
[Roadmapの履歴](https://github.com/Microsoft/TypeScript/wiki/Roadmap/_history)を見ると、[10/30(22?)まではES6対応は遠い未来の予定](https://github.com/Microsoft/TypeScript/wiki/Roadmap/_compare/90c52a59beb915661200f6a483d0895f6f1aa06f...b45a1bf7d97600f841b7bc19ae5f35394f8ae4e0)でした。
それが今や、1月とちょっとで、let & const([済](https://github.com/Microsoft/TypeScript/pull/904))、template stringsのサポート([済](https://github.com/Microsoft/TypeScript/pull/960))、ES6要素の型定義([途中](https://github.com/Microsoft/TypeScript/pull/987))、shorthand property([済](https://github.com/Microsoft/TypeScript/pull/1127))、computed property([済](https://github.com/Microsoft/TypeScript/pull/1272))などが怒涛の勢いで行われています。
開発早すぎだろ！？！？！？と驚くばかりです。
IEの開発も頑張ってよ！！と一瞬思いますが、TypeScriptチームから人が抜かれちゃったら嫌だから言わない。
とはいえ、TypeScriptが独自に仕様を~~ごまかしている~~定義しているmodule周りや、クラスの構文が式として扱えないのを改修する辺りはやはり仕様を決めるのも実装を変えるのも重たいためか、まだまだ着手されていないようです(2.0で対応予定のはず)。

[es6-compat](http://kangax.github.io/compat-table/es6/#typescript)にTypeScriptが追加されたようですが1.3.0の範囲でも割りと不正確です。つらみ。

## TypeScript側の動き

tc39のMTGで[Typesについて話し](https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#types)たりしているようです。

"型付けされてる" がTypeScriptの最大の特長なので、それがECMAScriptに入ったらマジでTypeScriptが正規のJavaScriptに成る日も夢ではない…！！

とはいえ、generatorのsugarとしてasync/awaitは割りと入れる気マンマンっぽいので、その辺りがES6との整合性がどうなるかは注視していきたいところです。

この辺りは[azuパイセンの資料](http://azu.github.io/slide/es6talks/)とか当たったほうがよさそう。
[ECMAScriptの現在の提案一覧](https://github.com/tc39/ecma262) [async/awaitの提案あるやん](https://github.com/jhusain/asyncgenerator)

## 結論：TypeScript = 未来のECMAScript

将来、TypeScriptが本当にJavaScriptになるんだとしたら、使わない選択肢がないじゃない？？
本当にその未来、60%くらいの確率であると思うんだ僕。

## オマケ：冬コミ情報

冬コミは相変わらず @mhidaka のとこの TechBooster(3日目西く02b) に混ざる感じです。
今回はわかめがTypeScriptについて90P前後一人で書いて一冊薄い本を作るという感じの挑戦をしてみて、死んでます。
1人で書いて1人で本にするので印刷代とかその他費用も全部自分で出す事になるのでみんなマジ買ってくれないと干からびちゃうのでよろしくです！
近日中に公式情報が出ると思います。

ちなみに、冬コミに前後して普通に全文公開することを検討しています。
紙版がそれなりに売れないとめっちゃ財布にダメージ来ちゃうのでよろしく！ほんとに！