TypeScript 10年の歩み

TypeScriptは、2022/10/01に10周年を迎えました。

ということで、それを記念してMicrosoftの中の人が振り返りのエントリーを書いていました。
以下は該当の記事、[Ten Years of TypeScript](https://devblogs.microsoft.com/typescript/ten-years-of-typescript/)の紹介です。

# Ten Years of TypeScript

2022年10月1日は、TypeScript10歳の誕生日です。

10年前の今日、2012年10月1日に、TypeScriptは初めて公にされました。

## The Early Days

初めてTypeScriptが表に現れたとき、それももっともなことでしたが、多くの否定的な意見がありました。
一部のJavaScriptユーザにとって、JavaScriptに型を強制する試みは冗談か邪悪な陰謀のように見えたかもしれません。

しかし、その試みには、多くのメリットがありました。
型チェックのおかげで、ファイルを保存する前にバグを見付けることができたり、コード補完やナビゲーション、リファクタリングといった豊富なエディタ機能を手に入れることができたのです。
社内外のチームがJavaScriptの複雑なコードベースに大きな課題を抱えていること、そしてJavaScriptがこれからあらゆるところで使われることになるだろうことも我々は認識していました。
それならば、JavaScriptを支援する強力なツールを求めない人はいないでしょう。
我々にはTypeScriptがどうあるべきかというビジョンがあり、実際[我々の初めての発表](https://web.archive.org/web/20121003001910/https://blogs.msdn.com/b/somasegar/archive/2012/10/01/typescript-javascript-development-at-application-scale.aspx)における主張は、現在のそれとほぼ同じです。

幸いなことに、このビジョンは他の開発者も同意するところでした。
まだバージョン1.0にも達していないその原型を反復し、構築し、実験を繰り返すことをいとわない熱心なユーザが、最初期からコミュニティに集まってくれました。
[DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped)プロジェクトのような新しい取り組み、StackOverflowやIssueトラッカーで手助けしてくれるメンバー、言語に関する本やチュートリアルを書いてくれる人、そしてTypeScriptのライブラリを書いてくれる人たちなどです。
彼ら忍耐強くパワフルな開発者たちによって、TypeScriptが成長するための礎が築かれていきました。

しかしながら、多くのJavaScript開発者は、TypeScriptを疑問視していました。
どうやって彼らJavaScript開発者たちに、動的型付け言語における静的型付けの良さを布教すればよいのでしょうか。
型の有り無しは、この世界では半世紀以上前から論争になっているテーマです。

我々は、型によってさらに良いJavaScriptを作りたいと心底から願っていました。

果たして、それは可能なのでしょうか？

## Standing the Test of Time

何かを広めるためには、開発に用いる手法とは全く異なるアプローチが必要です。
すなわち、粘り強さ、働きかけ、そして共感です。
TypeScriptはフリーなオープンソースであるので、それらのアプローチも隠さずに行わなければなりません。
TypeScriptは、JavaScriptとシームレスに相互運用され、JavaScriptと共に進化し、JavaScriptであるかのように感じられるものでなければなりません。
TypeScriptは決して、独立した言語にも、孤立した言語にも、規律的な言語にもなろうとしませんでした。
TypeScriptは記述型言語でなければなりませんでした。
JavaScriptのワイルド極まりない構文やパターンの上に、型システムを構築していくのです。

この方針のおかげで、我々は多くの開発者に見捨てられずに済みました。
そしてこの思想はまた、プロジェクトの目標にもぴったりと合っていました。

実際、当初の[TypeScriptのデザインゴール](https://github.com/microsoft/TypeScript/wiki/TypeScript-Design-Goals/53ffa9b1802cd8e18dfe4b2cd4e9ef5d4182df10)がどれほど維持されているかは驚くべきことです。

・追加コードに実行時のオーバーヘッドを発生させない
・現在および将来のECMAScriptに従う
・全てのJavaScriptコードの挙動を維持する
・式レベルの構文追加を避ける
・完全に消去可能な、構造的な型システムを使用する

これらはいずれも、TypeScriptがJavaScriptの型チェッカーであり、構文の追加は型チェックに必要なものにのみ収めることを表します。

そのため、我々は型システムに注力し、新しい構文や動作を追加することは避けました。
これは10年後から見たら当たり前のことに見えるかもしれません。

多くの型付き言語は、型に基いて実行時の挙動が変化します。
しかし、そのアプローチは、JavaScriptの上に構築され、JavaScriptと統合される言語にとっては不必要なものでした。
型付けされていないJavaScriptをTypeScriptに張り付けても完全に同じ動作をする必要があり、またTypeScriptからJavaScriptへの変換も、型を取り除く程度で簡単にできるものでなければなりません。
そのことに気付くまで、初期のTypeScriptにはいくらかの失敗がありました。
その反省を踏まえ、開発チームは10年のほとんどの間、実行時構文の追加を避けてきました。

現在は、TypeScriptに使いたい実行時機能が欠けている場合、我々はそれをTypeScriptに追加するわけでありません。
JavaScriptの標準化団体TC39とともに、全てのJavaScript開発者がその恩恵を受けられるように、新しい機能をJavaScriptに追加するように活動していくのです。

我々の成功の理由をもうひとつ上げるとするならば、TypeScriptがなんでもできる万能ツールを目指そうとしなかったことです。
我々の目標ではないもののひとつは、エンドツーエンドのビルドパイプラインを提供する、ということです。
そのかわりに、外部ツールがより複雑なビルドワークフローを動かせるようにシステムを拡張することを可能にします。

TypeScriptにLinter、Bundler、Optimizer、Minifier、オーケストレーションツールなどの機能を持たせてくれという要求は頻繁にやってきます。
実際TypeScriptを既に型チェッカー、コンパイラとして既に使っている場合は、その線引きは必ずしも明確ではありません。
JavaScriptのエコシステムは、いまだにベストプラクティスが変化し続けているため、TypeScriptは様々なニーズに合わせて柔軟性を維持することが重要でした。
過去数年の間に何億ものバンドラー、ランタイム、オーケストレータなどが登場しては消えていったことを考えると、TypeScriptはそれらの機能を置き換えるのではなく、それらとうまく協業していくことが重要だったことは明らかです。
我々はそれぞれのツールの制作者と協力し、TypeScriptとJavaScriptをより使いやすくするための努力を進めています。

## Back to Today

こんにち、TypeScriptは世界中でたくさんの開発者に利用されている、活発な言語になりました。
[StackOverflow](https://survey.stackoverflow.co/2022/)、[GitHub](https://octoverse.github.com/#top-languages-over-the-years)、[Redmonk](https://redmonk.com/sogrady/category/programming-languages/)といった各種アンケートや調査においてもTypeScriptは常に上位にランキングされ、最も愛される言語のトップ5…とまでは言わないにしても、トップ10には常に入っています。

もちろん前提に注意は必要です。
TypeScriptは基本的にJavaScriptと密接に関係しており、全てのTypeScriptの開発者はJavaScriptの開発者でもあるのです。
ありがたいことに、JavaScript開発者にTypeScriptを使っているか、気に入っているかを[尋ねた](https://2021.stateofjs.com/en-US/other-tools)場合でも、その回答はだいたいイエスです。

これほどにTypeScriptが成功するとは、10年前どころか数年前の時点ですら予想していませんでした。
もちろん開発チームはTypeScriptに懸命に取り組んできましたが、この成功をもたらした本当の功労者はコミュニティであることを我々は知っています。
外部のTypeScriptコントリビュータ、TypeScriptライブラリ作者方、DefinitelyTypedのコントリビュータ、コミュニティの運営者、時間を割いて質問に回答したり初心者のために道を作ってくれたエキスパートたち、全てのTypeScriptユーザに心から感謝します。

TypeScriptのこれからの10年が、皆様にとってさらによいものであることを願っています。


# コメント欄

「おめでとうございます！TypeScriptの栄光はまだまだ続く！」
「TypeScriptはJavaScriptを救った。」
「Dartとどっちを取るか迷ったけどTypeScriptを選んでよかった。」
「10周年おめでとう！次の10年も楽しみにしてる！」
「いや待てリンクにあるゴールは現在のゴールだ、オリジナルのゴールじゃない。昔はenumとか新シンタックスを増やしてたぞ。」


# 感想

JavaScriptは、少なくとも開発当初のJavaScriptは[あんまり深く考えずに作られた](https://qiita.com/rana_kualu/items/c66f84235c2dd6bbe51f)言語であり、いまだに[奇怪な仕様が大量に残されて](https://qiita.com/rana_kualu/items/793f0cbdde6a88f86394)いるため、うっかり道を踏み外してしまうとたいへん酷い目に遭いかねません。
そんな破壊と慈悲の混沌であるJavaScriptに、ある程度の秩序をもたらしたTypeScriptは、たいへん偉大な存在と言えるでしょう。

このようにJavaScriptをどうにかしようという試みは[AltJS](https://www.wdic.org/w/TECH/altJS)と呼ばれ、様々な実装が存在します。
ただその多くは、全く別の言語からコンパイルすることでJavaScriptに変換するというアプローチでした。
有名どころとしてはCoffeeScriptやDart等がありますが、JavaScriptとは文法が異なるため学習コストが嵩み、安全性と共に敷居も高くなってしまいました。
そんな中TypeScriptは『JavaScriptの文法はそのままで、ほんのちょっと追加するだけ』という方針で大成功しました。

はい、逆に言うと、ほんのちょっと追加するだけという気持ちで気軽にとりあえず入れてしまってよいのです。
JavaScriptの開発者は全員TypeScriptの開発者でもあるからです。

TypeScriptを調べると型がどうのとか大規模開発がどうのとか色々出てきますが、気にする必要はありません。
型なんか最初は全部anyでかまいません。
こんなこと言うとすぐプロとかエキスパートとかいう人たちが[棍棒で殴りかかってくる](https://qiita.com/uhyo/items/aae57ba0734e36ee846a#any%E3%81%AE%E5%8D%B1%E9%99%BA%E6%80%A7)のですが華麗に無視しましょう。
気軽に導入できる、ということこそがTypeScriptが成功した理由だからです。