Nuxt.js TypeScript - 実践TypeScript アップデート -

今年6月に、[実践TypeScript](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5TypeScript-BFF%E3%81%A8Next-js-Nuxt-js%E3%81%AE%E5%9E%8B%E5%AE%9A%E7%BE%A9-%E5%90%89%E4%BA%95-%E5%81%A5%E6%96%87/dp/483996937X/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=31WZDQDUJSWJA&keywords=typescript&qid=1571622493&sprefix=types%2Caps%2C246&sr=8-1) という書籍で、Nuxt.js に TypeScript を導入する方法を執筆させて頂きました。**「書籍で扱っている Nuxt.js のバージョンが少し古いけど、今現在はどうするのが良いの？」**という読者の方から寄せられた疑問に、アップデートとして私的見解をここにまとめました。（といっても、すでに日本語の良記事で紹介されている内容と変わりなく、n番煎じですmm）





## typescript.nuxtjs.org

少し日が経ちましたが、Nuxt.js の [公式TypeScript導入ガイド](https://typescript.nuxtjs.org/) が公開されています。このガイドは、最新の Nuxt 2.10 以降向けとして書かれています。更新が目的であれば、[Migration from Nuxt 2.8](https://typescript.nuxtjs.org/migration.html) を必ず確認するようにしましょう。




## custom server framework で異なる型定義
基本的に [公式TypeScript導入ガイド](https://typescript.nuxtjs.org/) に準拠します。しかしながらここでは、**「custom server framework を選択していない・選択している」**という観点が考慮されていません。書籍で Nuxt.js の型定義に触れているところは、次の２節です。この二つは「custom server framework を選択していない・選択している」という、大きな違いがあります。

- 11章1節「TypeScript ではじめる Nuxt.js」
- 11章3節「Nuxt.js と Express」

Nuxt.js のアップデートに伴い、前者に大きな変化がありました。読み進めるにあたり、どちらのユースケースを想定しているのか、まず確認してください。本記事は主に、執筆時点で v2.7.1 であった前者に対し言及しています。




## [Introduction](https://typescript.nuxtjs.org/guide/)
Nuxt.js 関連の型定義は次の3つのパッケージに分割・外部化され、Nuxt 2.9以降のコアから削除されました。

- @nuxt/types
- @nuxt/typescript-build
- @nuxt/typescript-runtime

必須になるのは`@nuxt/typescript-build`です。`@nuxt/typescript-runtime`は後述する `nuxt-ts` の利用有無に伴い、必要に応じてインストールすることになります。`@nuxt/types`はどちらにも含まれるため、直接のインストールは不要です。




## [Setup](https://typescript.nuxtjs.org/guide/setup.html)
基本的に必要になることは書いてあるとおりです。順番に書いてある通りで問題なく設定できるかと思います。

- Installation：`@nuxt/typescript-build`のインストール
- Configuration：`nuxt.config.js`に追記。`tsconfig.json`を作成。




## [Runtime (optional)](https://typescript.nuxtjs.org/guide/runtime.html#installation)

`@nuxt/typescript-runtime`は`ts-node`を内包しており、ラッパーである`nuxt-ts`を提供しています。**そのためこのパッケージは、dependencies に追加する様に注意しましょう。**これを利用すると、設定の煩雑さが軽減され、以降の migration コスト軽減が期待できます。

custom server framework を選択していない場合、ビルトインサーバーが利用されます。`modules`や`serverMiddlewares`の型定義は[Modules (Runtime)](https://typescript.nuxtjs.org/cookbook/modules.html) や [Server Middlewares (Runtime)](https://typescript.nuxtjs.org/cookbook/server-middlewares.html)のように、内包されている`@nuxt/types`から提供される型で事足ります。






## nuxt-ts 使う？使わない？

custom server framework を選択していないのであれば、`@nuxt/typescript-runtime`が提供する`nuxt-ts`は利用した方が手早く環境構築できると思います。書籍の11章1節「TypeScript ではじめる Nuxt.js」に書かれている環境構築方法は、`nuxt-ts`を利用する方法に移行することをお薦めします。


## [Components](https://typescript.nuxtjs.org/cookbook/components/)
Component の Props 型安全を実現するため、書籍では`PropType`型を利用する型情報付与を紹介しています。公式ガイドの様に、`PropOptions`型でアサーションを付与する方法には触れていませんが、こちらの様に記述することも可能です。ユースケースに併せて選択してください。

```typescript
export default Vue.extend({
 props: {
    user: {
      type: Object,
      required: true
    } as PropOptions<User>
  }
})
```



## [Store](https://typescript.nuxtjs.org/cookbook/store.html)

Store に関しては「Vuex をそもそも利用しない」という選択もありますが、必要なシーンが出た場合には、参考にしてみてください。

#### [Class-based]
`vuex-class-component`は、デコレータでモジュールを定義するアプローチです。Nuxtとの完全な互換性はまだありませんが、新しいAPIをリリースしたそうです。 

#### [Vanilla](https://typescript.nuxtjs.org/cookbook/store.html#vanilla)
通常の JavaScript で記述する様な Vuex Store 定義に対し、型定義を付与する方法です。書籍の11章2節で紹介している通り、より型安全にするための余地があります。[vuex-guardian](https://qiita.com/Takepepe/items/593d2d9e7dfd38eddbd4) は Vanilla での記述をサポートする型生成ツールで、こちらを利用すると、書籍に記されているよりも簡単に型情報の付与を行うことができます。




## [Configuration](https://typescript.nuxtjs.org/cookbook/configuration.html)
nuxt.config.ts 向けの型定義です。nuxt.config を TS で書く場合に利用します。

```nuxt.config.ts
import { Configuration } from '@nuxt/types'
const config: Configuration = {
  mode: 'universal',
  head: {}
  ...
}
export default config
```




## [Middlewares](https://typescript.nuxtjs.org/cookbook/middlewares.html)
custom server framework で`Express`などのフレームワークを選択している場合、11章3節で紹介している様に、手詰まりになるケースが想定されます。`@nuxt/types/app/index.d.ts` を拡張するなど、型定義強化の余地があります。




## [ServerMiddleware](https://typescript.nuxtjs.org/cookbook/server-middlewares.html)
custom server framework で`Express`などのフレームワークを選択している場合、`@nuxt/types` で提供されている `ServerMiddleware`型は利用せず `Express` など外部モジュールから import した型を利用した方が良さそうです。Express サーバーの RouteHandler 相当をここに記述することになるためです。




## 免責事項
Lint、Plugin や Modules など、書籍で触れられなかった項目についても typescript.nuxtjs.org では言及されています。これらは 書籍内容更新という観点からはそれるため割愛させていただいています。ご了承ください。