🎄

TypeScript豆知識集

2023/12/15に公開1

はじめに

この記事はTypeScript Advent Calendar 2023の15日目の記事です。
フロント開発からバックエンド開発まで、みなさんが大好きなTypeScriptですが、今回は意外と?知られていない豆知識を紹介していきたいと思います。
技術的に為になる記事は他のみなさんが書いてくださっているので、僕は今回ネタ枠で投稿させてもらいます!

作者

TypeScriptは天下のMicrosoft社によって開発されているOSSのプログラミング言語です。
C#のリードアーキテクトでもあるアンダースヘルスバーグという方によってチームが作成され、開発がスタートしました。
https://ja.wikipedia.org/wiki/アンダース・ヘルスバーグ

AltJS

TypeScriptのようにJavaScriptにトランスパイルされる言語をAltJSと読んでいました。
TypeScript以外のAltJSはほぼ滅んだので最近はあまり使われない言葉です。
たとえばCofeeScriptという言語がありました。
ここからは私の意見ですが、TypeScriptがその中で生き残れたのは、やはりJavaScriptのスーパーセットであることを選んだからでしょう。
JavaScriptの構文を壊さず、拡張する方向で構文が用意され、JavaScriptを書いていた人たちが簡単にTypeScriptに移行できました。
他のAltJSはトランスパイル後のJavaScriptが想像しづらく、学習コストも生まれてしまいました。
また、TypeScriptはランタイムにほぼ影響を与えません。
Enumなどの特殊な構文はあるものの、現在は非推奨で、基本的にはTypeScriptがJavaScriptにない機能を足すような動きはなくなりました。

バージョニング

実はTypeScriptはセマンティックバージョニングを採用していません。
https://github.com/microsoft/TypeScript/releases
なので実はTypeScript4.9と5.0のバージョンチェンジは、4.8と4.9のバージョンチェンジと特に違いはありません。
破壊的変更があるかどうかはそのバージョンによって違います。
例えば5.1から5.2でも破壊的変更があります。
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#breaking-changes-and-correctness-fixes
シンプルに3.9の次は4.0という感じで少数第一位がいっぱいになると整数がインクリメントされるというバージョニングになっています。

ランタイム

TypeScriptといえば、JavaScriptにトランスパイルされる言語のイメージがありますが、最近だとDeno、Bunといった、書いたTypeScriptがそのまま動作する実行環境があります。
厳密にはDenoもBunも一度JavaScriptに変換しているようですが、それらを意識せずにrunコマンドだけで動かせるようになるのは魅力的です。
https://deno-ja.vercel.app/manual@main/typescript/overview
https://bun.sh/docs/runtime/typescript

Playground

これは知っている人も多いかもしれませんが、ブラウザ上で動くPlaygroundがあります。
https://www.typescriptlang.org/play
バージョンも選べ、コードのシェアなどもできるのでとても便利です。
使い勝手がいいので、自分はJavaScript自体の仕様確認もここでやったりします。

DefinitelyTyped

https://github.com/DefinitelyTyped/DefinitelyTyped
JavaScriptやTypeScript以外のAltJSで書かれたライブラリを使う時に必要な型定義があつまっているリポジトリです。@types/ライブラリのやつですね。
実はこれはコミュニティによって作られているので、ライブラリの実態と異なる場合があります。
もしあなたがライブラリ作者でTypeScriptでライブラリを作るのなら、これを使うのではなくてライブラリに型定義を同梱することをおすすめします。
https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.ja.md#マッチするパッケージがない型定義はどうなるのですか
ちなみにReactはFlowというAltJSで書かれているのでこのDefinitelyTypedから型定義が提供されています。

namespace

TypeScriptには実は名前空間があります。
https://zenn.dev/uhyo/articles/ts-namespace-2023
ただ非推奨というわけではないですが、ライブラリの型定義をexportする時くらいしか使う用途がなさそうです。
また、名前空間から変数をエクスポートも出来るのですが、TypeScriptはJavaScriptのランタイムに干渉しない、文法を壊さないという方向で進化してきたのでこれもやはり忌避されています。
https://qiita.com/yuki153/items/a51878ad6a1ce913af48

おわりに

長年TypeScriptをやっている方は、結構ご存知の豆知識が多かったかと思います。
知らなかった豆知識があった人はラッキーでしたね!

2024年は自分もスタッフを務めるTSKaigiが開催されますので良かったら遊びに来てください!
https://twitter.com/tskaigi

2023年も残りわずか、健康に気をつけてお過ごしください。
メリークリスマス!

Discussion

ちゃちゃ

やっぱりWASMも他のAltJSを見なくなった原因なんですかね〜