【Nuxt3アップグレード】エディタがTypeScriptを認識しない問題

はじめてNuxt3へのアップグレードを経験した人は、エディタが真っ赤になり驚くと思います。この記事では、そんな中でも、いつまでも真っ赤な画面と戦っている人に向けて解消方法を説明します。

2023年10月04日

ぱぱっと解決しちゃいたい人はこちら
https://nuxt.com/docs/guide/concepts/typescript

公式ページを隅々まで見ればいい話だった。

前提

  • Nuxt2のプロジェクトが存在する
  • TypeScriptを使用している
  • エディタが真っ赤
  • Nuxt3へのアップデートを検討している

エラーの原因

Nuxt3は、TypeScriptの設定や型定義が大幅に変更されています。そのため、Nuxt2の設定がそのままではNuxt3と互換性がなく、エディタ上でのTypeScriptエラーが発生することがあります。

例) ts(2345), ts(2307), ts(2304)

tsconfig.jsonの修正

おそらくこちらのコマンドでアップグレードしたかと思います。
※ 全て手作業ではない限り

$ npx nuxi upgrade

便利ですが、tsconfig.jsonまでは修正してくれません。

通常、yarn generateyarn dev などのコマンドを実行する際に .nuxt/ というフォルダが自動生成されます。

nuxt3からは .nuxt/ の中に tsconfig.json も自動生成されているので、こいつをルートディレクトリのtsconfig.jsonで継承していきます。

// これが自動生成されているやつ
{
  "compilerOptions": {
    "forceConsistentCasingInFileNames": true,
    "jsx": "preserve",
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "Node",
    "skipLibCheck": true,
    "strict": true,
    "allowJs": true,
    "baseUrl": XXX,
    "noEmit": true,
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true,
    "types": [
      "node"
    ],
    "paths": {
      "~": [
        "/path/to/dir"
      ],
      "~/*": [
        "/path/to/dir/*"
      ],
      "@": [
        "/path/to/dir"
      ],
      "@/*": [
        "/path/to/dir/*"
      ],
      "~~": [
        "/path/to/dir"
      ],
      "~~/*": [
        "/path/to/dir/*"
      ],
      "@@": [
        "/path/to/dir"
      ],
      "@@/*": [
        "/path/to/dir/*"
      ],
      "assets": [
        "/path/to/dir/assets"
      ],
      "assets/*": [
        "/path/to/dir/assets/*"
      ],
      "public": [
        "/path/to/dir/public"
      ],
      "public/*": [
        "/path/to/dir/public/*"
      ],
      "#app": [
        "/path/to/dir/node_modules/nuxt/dist/app"
      ],
      "#app/*": [
        "/path/to/dir/node_modules/nuxt/dist/app/*"
      ],
      ~~~
    }
  },
  "include": [
    ~~~
  ],
  "exclude": [
    ~~~
  ]
}

自分のtsconfigで継承する

// extends以外はよしなに。
{
  "extends": "./.nuxt/tsconfig.json",
  "esModuleInterop": true,
  "noUnusedLocals": true,

  "compilerOptions": {
    "typeRoots": [
      "./.nuxt",
      "./types",
      "./node_modules/@types"
    ],

    "types": [
      "node"
    ]
  }
}

注意

extends以外の設定 compilerOptions, include, exclude などは継承元の記述を上書きしてしまうので、よく確認して精査しましょう。

筆者情報
IT業界経験6年目のフルスタックエンジニア。
フロントエンドを軸として技術を研鑽中でございます。