TL;DR

  • コードが動く環境を正確にモデリングすると、TypeScript はコードをより適切にチェックできる。
  • lib の設定、<script> で読み込むグローバル変数やライブラリの型宣言、webpack で import するファイルの型宣言でモデリングする。

内容

環境をモデリングする

TypeScript のコードは JavaScript に変換され、特定の環境(ブラウザ、テストランナー、Deno、Electron など)の特定のランタイム(V8、JavaScriptCore、SpiderMonkey など)で動く。この環境を正確にモデリングすると、TypeScript はコードをより適切にチェックするようになる。

モデリングの方法の 1 つが、tsconfig.json の lib の設定である。たとえば "DOM" はブラウザ用の型宣言を含め、"ES2021" は 2021 年に承認された JavaScript の標準仕様の型宣言を含める。"ES2021" を指定した場合、それより後に追加された機能を使うと型エラーになる。ほかに、@types/web パッケージを使うと、Web ブラウザで使える型をモデリングできる。

グローバル変数とライブラリ

<script> で読み込まれるグローバル変数もモデリングしたほうがよい(項目47)。

<script type="text/javascript">
  window.userInfo = { name: "Jane Doe", accountId: "123-abc" }
</script>
interface UserInfo {
  name: string
  accountId: string
}
 
declare global {
  interface Window {
    userInfo: UserInfo
  }
}

<script> で読み込むライブラリも同様である。たとえば jQuery や Google Analytics を読み込んでいるなら、それぞれの型宣言パッケージを入れる(項目66)。

npm i -D @types/google.analytics @types/jquery

バンドラで読み込むファイル

webpack を使って JavaScript から CSS や画像ファイルを直接 import する場合、そのままでは TypeScript が認識できない。

import sunrisePath from "./images/beautiful-sunrise.jpg"
// Cannot find module './images/beautiful-sunrise.jpg' or its type declarations.

これを避けるには、型宣言でモデリングするか、別途 npm パッケージを追加する。

// webpack-imports.d.ts
declare module "*.jpg" {
  const src: string
  export default src
}

複数の環境

クライアントとサーバのように異なる環境をモデリングするには、複数の tsconfig.json とプロジェクト参照を使う(項目78)。

キーワード