TypeScript 6.0に上げたかった

はじめに

こんにちは!Frontendチームの薄羽です。TypeScript 6.0がリリースされました🎉内部向けに6.0に上げるまでの手順を書こうと思いましたが、せっかくなら詰まったところを全世界に共有した方が良いと思い、テックブログにします。エイプリルフールに執筆していたので、タイトルを「TypeScript 6億」にしようと思いましたが、全然面白くなかったためやめました。あと、タイトルにもありますが上げられなかったです。

TypeScript 6.0とは

詳しくは公式ブログを参照してください!TypeScriptは7.0からGo言語での実装になります。6.0は7.0に移行するためにいくつかの設定がdeprecatedになっています。また、TypeScriptで書かれた最後のTypeScriptです。

手順

おそらく、多くの方が以下の手順をとっていると思います(我々もそうです):

  1. typescript-eslint をあげる
  2. typescript をあげる(tsconfig.json を修正)

typescript-eslint をあげる

以下のIssueで詰まりました😢

github.com

no-unnecessary-type-arguments のautofixによって、必要な型が削除されてしまい、tsc が通らなくなりました。この問題は 8.58.0 から発生しており、8.58.0peerDependencies"typescript": ">=4.8.4 <6.1.0" になっており、このバージョンから6.0に対応しています。正直、TypeScriptのバージョンを上げてエラーが起きなければ typescript-eslint を上げなくても良いと思いましたが、急ぎではなかったため、このIssueの解決を待つことにしました。

tsconfig.json を修正

6.0から types のデフォルトが [] になっています。これを ["*"] とすると6.0未満と似た挙動になる(node_modules/@types が全列挙される)のですが、必要なものだけを列挙する方が型チェックのパフォーマンスは良くなります。importしているパッケージの @typestypes に列挙する必要はないため、["node"] などを書けば良いです(import fs from "node:fs" のような node: プロトコルのimportがあれば @types/node を自動で解決してほしいとは思いました)。

もう1つ我々に関係した設定は noUncheckedSideEffectImports です。デフォルトが true に変更されています。false だと副作用のみのimport(e.g., import "@itandi/something")はパッケージ名が誤っていてもエラーになりません。itandi-frontend の場合はBiomeで noUndeclaredDependencies が設定されているため、package.json にないパッケージ名は biome check で落ちます。ただ、./index.css のような相対パスでのimportは検知されません。誤ったimportはランタイムで検知できますが、tsc でチェックしたいと思い、デフォルトの true にしました。true にすると ./index.css でエラーになりました😇

最終的に "types": ["gtag.js", "vite/client"] を加えました。前者は window.gtag 用で、後者はStorybook(Vite)用です。

おわりに

アップデートで困っている人は参考にしてみてください!業務連絡ですが、typescript-eslint のIssueが解決されたらイタンジのエンジニアはこれを読んで6.0にしてください!