🙆‍♀️

Vue2 + vuetify + composition API に TypeScriptを導入する方法

2022/07/16に公開

Vue2 + vuetify + composition APIで作っているアプリにTypeScriptを導入しました。
Vue3で作っていればこんな手間は必要ないのですが💦
こういう仕事もありますよね>.<

TypeScriptを導入するにあたり、手こずった点がいくつかあったので、
今後スムーズに導入出来るように手順をまとめました!

1. TypeSciprt関連ライブラリをインストール

必要ライブライを探るために、vue-cliでvue2+typesciprtの新規プロジェクトを作成し、
package.jsonのライブラリの内、TypeScriptに関連ありそうなライブラリを追加します。

以下がvue2+typesciprtの新規プロジェクで追加されているTypeScript関連のライブラリです。

"@typescript-eslint/eslint-plugin": "^5.4.0"
"@typescript-eslint/parser": "^5.4.0"
"@vue/cli-plugin-typescript": "~5.0.0"
"@vue/eslint-config-typescript": "^9.1.0"
"typescript": "~4.5.5"

これをまとめてインストールします。

yarn add -D @typescript-eslint/eslint-plugin @typescript-eslint/parser @vue/cli-plugin-typescript @vue/eslint-config-typescript typescript

以下warningが出ますが、インストールは完了します。
(警告内容と解決方法分かる方いましたら、教えて頂けたら嬉しいです!)

npmご利用の方向へ

npmで上記ライブラリをインストールしようとすると、依存エラーが出て失敗します。
失敗の原因は、以下2つのライブラリですが、根本原因もnpmでの解決方法が分りません。。

"@vue/cli-plugin-typescript"
"@vue/eslint-config-typescript"

yarnでは警告は出るもののインストール自体はできるので、yarnで進めることにしました。
以下yarnへの移行方法を簡単に紹介します!

yarnをインストールします。

npm install -g yarn

以下コマンドで、package-lock.jsonからyarn.lockに移行できます。

yarn import

yarn.lockファイルが作られたら移行完了なので、package-lock.jsonは削除しましょう。

以下、よく使うコマンド対応です。

  • npm install -D ⇒ yarn add -D
  • npm run serve => yarn serve

2. tsconfig.json作成

ルートディレクトリにtsconfig.jsonを作成します。
jsconfig.jsonは不要となるので削除します。

tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "forceConsistentCasingInFileNames": true,
    "useDefineForClassFields": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env",
      "vuetify" //vuetifyを入れいてる場合は追記
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

tsconfig.jsonを作成した際に、以下のエラーが出ることがあります。

構成ファイル '.../tsconfig.json' で入力が見つかりませんでした。指定された 'include' パスは '["src/**/*.ts","src/**/*.tsx","src/**/*.vue","tests/**/*.ts","tests/**/*.tsx"]' で、'exclude' パスは '["node_modules"]' でした。

これは、main.jsをmain.tsに変更することで解消されます。

3. eslint設定ファイルを修正する

.eslint.jsに3つ追加します。
ルールに追加しているものは、移行作業を徐々に行うためのもので、必須ではない & 移行作業が終わったら削除するルールです。

.eslint.js
module.exports = {
  root: true,
  env: {
    node: true,
  },
  extends: [
    "plugin:vue/essential",
    "eslint:recommended",
    "@vue/typescript/recommended", //追加
    "plugin:prettier/recommended",
  ],
  parserOptions: {
    ecmaVersion: 2020,
  },
  rules: {
    "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
    "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
    //vueファイルのsetup関数が空だと怒られる。そのまま残しておきたいので、エラーをもみ消す。
    "@typescript-eslint/no-empty-function": "off",
    //以下追加。typescript導入初期は大量のエラーが出るため、全スクリプトにTS無視コマンドを入れる。
    //それを許可するルール
    "@typescript-eslint/ban-ts-comment":
      process.env.NODE_ENV === "production" ? "warn" : "off",
  },
}

4. vueの型ファイルを作成

srcディレクトリにshims-vue.d.tsファイルを作成します。
これはvueファイルを型を定義するもので、これを作成しないと、各コンポーネントでvueファイルをインポートする際に怒られます。

shims-vue.d.ts
declare module "*.vue" {
  import Vue from "vue"
  export default Vue
}

5. 主要ファイル名を.jsから.tsに変更する

1) main.js をmain.tsに変更

.tsに変更すると、importしているファイルにエラーが表示されると思います。
それらをts化していきます。

2) router/index.js を router/index.tsに変更

importでエラーになっている箇所がある場合は、.vue拡張子をつけましょう!!
上でvueの型ファイルが作成されていれば、エラーは解消されるはずです。

↓ 

import VueRouter, { RouteConfig } from "vue-router"
(省略)

//型を追加
const routes: Array<RouteConfig> = [
  {
    path: "/",
    name: "home",
    component: HomeView,
  }
]

3) vuetifyをTypeScript化する

src/plugins/vuetify.jsをvuetify.tsに変更します。
ファイル名を変更すると、以下importでエラーが出ると思います。

以下のように修正すれば、エラーは消えます。

src/plugins/vuetify.ts
import Vuetify from "vuetify/lib"

6. vueファイルをTypeScript化する

つづいて、vueファイルのscriptをTypeScriptに変更します。

1) scriptにlang="ts"を追記する

*.vue
<script></script> //既存コード
<script lang="ts"></script> //このように変更する

vscodeの置換機能で一気に変更すると便利です。ただし、vueファイルとは関係ない<script>タグも存在するので、慎重に変更しましょう。

2) 全vueファイルに@ts-nocheckを入れる

vueファイルのscriptタグ直下に//@ts-nocheckを入れることで、TypeScriptチェックを無効にすることが出来ます。

*.vue
<script lang="ts">
//@ts-nocheck
</script>

一旦チェックを無効にしておき、TS移行作業を行うファイルで//@ts-nocheckを削除することで、好きなタイミングでファイルのTS化を行うことが出来ます。これでTypeScript導入初期に発生する大量のエラーを一時的に回避できて移行しやすくなります。(気持ちが楽になります)!

vscodeの置換ツールで、このように変更すると楽です!

7. 変数や関数に型をつける

あとはTypeScriptのルールに沿って型付けをしていけばOKです!

1点、propsに型付けをするのが少し特殊なので、それだけ書いておきます。

propsに型をつけるのは、PropTypeを使って以下のように書きます。

sample.vue
<script lang="ts">
import { defineComponent, PropType } from "@vue/composition-api"

interface User {
  id: string
  name: string
}

export default defineComponent({
  props: {
    users: Array as PropType<Array<User>>,
    user: Object as PropType<User>,
  },
  setup() {},
})
</script>

まとめ

今回はvue2プロジェクトにTypeScriptを導入する手順を書きました。
序盤は割と手こずったので、導入手順をまとめてみました。

vue3が登場したので、vue2のままTypeScriptに移行するケースは稀だと思いますが、
少しでもお役に立てたら幸いです!

Discussion