本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
それではTypeScriptの動向ということで、@Quramyから発表させていただきます。
今日話したいのは、ECMAScriptにTypeScriptが含まれる日が来るかもしれないというお話です。
Microsoftによる草案「Type Syntax Proposal」
実は最近、Type Syntax Proposalという名前の仕様が提出されているんですね。これのお話です。
このType Syntax Proposalとはなんぞや、という話になるのですが、今年の3月ぐらいだったかな、TypeScriptを作っているMicrosoftが、TC39というJavaScriptの言語仕様を検討している団体に提出した草案がこのType Syntax Proposalです。
どういったものかというと、この(スライドの)上段は今のJavaScriptの世界です。TypeScriptのファイルはさまざまなツール - TypeScriptかもしれないしBabelかもしれないツールによってJavaScriptにコンパイルされてブラウザで実行されます。
この仕様の後の世界では何を考えてるかというと、間のコンパイルというのをすっ飛ばしてそのままブラウザで動かしましょうという仕様なんですね。なのでトランスパイルせずにファイルが実行できるようになると。
ここで絶対に誤解しないでほしいのですが、「このJavaScriptエンジン=ブラウザが型のチェックをしてくれるというものでは決してないですよ」というところは押さえておいてほしいポイントです。
Type Syntax、シンタックスっていうのは文法ってことですよね。文法の話であって「意味=Semantics」というところにはいっさい踏み込まないのがこのType Syntax Proposalです。
Type Syntax Proposalのイメージ
もう少し具体的な例で見ていきたいと思います。
左下のTypeScriptのコードがあったとして、このコードをJavaScriptのエンジンは:numberという、今の世界ではTypeScriptの記法ですけど「このアノテーション部分を切り落として実行してくださいね」というのがこのType Syntax Proposalのイメージです。
よく見るとこのコード、右辺がstringの10だけど、:number(数値)として型付けしてるのでTypeScriptとして考えるとこれは間違った方法なんですよね。だけど、JavaScriptの世界では「その話は無視してください。アノテーションが正しいかどうかは気にしなくていいですよ」という仕様です。
わかりやすい例でいうと、今のTypeScriptの「$ tsc –target esnext」と同じようなことをJavaScriptエンジン側でやってくれ、というイメージですね。そのように文法を標準化しようぜ!という話なんですけど、これがどういう意味があるのかなってことをちょっと考えてみました。
文法が標準化される意味 - Microsoft、サードパーティ、そしてデベロッパ
まずTypeScript本家のMicrosoftにとってはこのType SyntaxがECMAScriptに含まれるということは、これがもし本当にECMAScriptに入ると、その後、構文の追加をするときにはもう標準化プロセスを通過する必要が都度都度発生することになるので、勝手に構文が変更できなくなるんです。要するに自分たちのものじゃなくなるということなんですよね。
なので、ある意味ではけっこう面倒くさいことになるかもしれないですけど、それをMicrosoft自身で今回も提案してるということは、もう彼らにとってもTypeScriptの構文って十分に固まってきてると見ているんだろうな、と思っています。さすが今年10歳のTypeScriptですよね。
で、他のサードパーティトランスパイラから見るとどういうことなんだろうというところですね。
たとえばさっきもちょっと名前を挙げましたけど、Babel、SWC、esbuildみたいな、こういったいわゆるサードパーティ製のトランスパイラっていうのは近年、利用があたりまえになってきてるのかなと思ってます。
実はこの辺のツールたちっていうのはTypeScriptの構文解析っていうのを自分でやってるんですよね。ということは、TypeScript側が勝手に新しい文法とかを追加するとこのツールたちって壊れちゃうんですよ。なんですが、文法が標準化されるっていうことはこういうサードパーティツールの人たちにとってもありがたみがありますし、もちろんそれをふだん使っている人にとってもありがたい話になっていくのかなと思っています。
じゃあ我々、実際にデベロッパはどうしたらいいのか - 今はStage 1なのでどうこうするということはないんですけど、namespase、enumといった機能はこの仕様の範囲外とされているので、こういった機能は基本的には使わないようにするといいのかなと思っています。
どうもありがとうございました。