🛣️

TypeScript で Vue Router の route parameter を string 型に変換する方法

2024/05/17に公開

こんにちは。 SAW です。
最近、 水曜どうでしょう を Netflix で見始めました。
映像に時代を感じながら視聴しています (笑)

Nuxt のルーティングには、 Vue Router が利用されています。
Vue Router を利用すると、 URL 内に埋め込まれたパラメーター (以下 route parameter と表記) を Vue コンポーネントから取得できます。
以下の例では、 :id の部分にパラメーターの値が埋め込まれます。

route parameter の例
/users/:id

route parameter で取得できるパラメーターの型は string|string[] のユニオン型 です。
TypeScript を利用している場合、変数への代入や関数の引数に渡す際に 型エラー を起こす場合があります。

本記事では、 Vue Router の route parameter を string 型に変換する方法 を紹介します。

なお、本記事で前提とする各パッケージのバージョンは以下の通りです。

  • Nuxt: 3.8.0
    • Vue Rouer: 4.2.5

対象読者

本記事で想定する読者層は次の通りです。

  • Vue Router について基本的な知識を有している
  • TypeScript について基本的な知識を有している

Vue Router で route parameter を取得する方法

Vue Router では、次の手順で route parameter の値を取得できます。

  1. Vue Router の useRoute() を実行する
  2. 1 で取得したオブジェクトの params オブジェクトを参照する
  3. 取得対象の route parameter を 2 で取得した params のプロパティとして指定する
router parameter の取得方法
import { useRoute } from 'vue-router';

const route = useRoute(); // (1)
const { params } = route; // (2)
const id = params.id; // (3) :id に埋め込まれた値を取得

route parameter を string に変換する方法

続いて、本題である route parameter を string 型に変換する方法 について説明します。

route parameter を string 型に変換するには、以下のコード例のように型アサーションの as を利用して string 型にキャスト します。

route parameter を string に変換するコード例
import { useRoute } from 'vue-router';

const route = useRoute();
const id = route.params.id as string; // id: string

上記のコード例では、 route parameter である idstring 型に変換されます。

Vue Router における route parameter の型

ここからは、 route parameter を取得するために利用したオブジェクトについて、型を確認してみます。

まず、 useRoute() の返却型は RouteLocationNormalizedLoaded です。
このオブジェクトに、現在のパスやパラメーターなどの情報が格納されています。

次に、 params プロパティは RouteParams 型です。
公式ドキュメントや型定義を確認すると、 RouteParamsRecord<string, RouteParamValue|RouteParamValue[]> と定義されています。

https://github.com/vuejs/router/blob/bf38a030cf22e765ccbbc77fbb3db118f9632224/packages/router/src/types/index.ts#L35

また、 RouteParamValue の型定義を確認すると、実体は string であることがわかります。

https://github.com/vuejs/router/blob/bf38a030cf22e765ccbbc77fbb3db118f9632224/packages/router/src/types/index.ts#L27-L30

useRoute() の返却値から route parameter の型はそれぞれ以下のようになります。

router parameter の型
const route = useRoute(); // route: RouteLocationNormalizedLoaded
const { params } = route; // params: RouteParams
const id = params.id; // id: RouteParamValue|RouteParamValue[]

補足: Record<Keys, Type> 型について

TypeScript の公式ドキュメントを確認してみると、 Record<Keys, Type>Keys 型のキーを持ち、 Type 型の値を持つオブジェクトを構築する ユーティリティ型 と書かれています。
動的にキーを生成するようなオブジェクトで、キーと値の型を指定する場合に利用できます。

文章で説明するより、簡単なコード例を見たほうがわかりやすいでしょう。
Record<Keys, Type> 型を利用して座標を表す Coordinates 型の定義と使用例を以下に示します。

Record 型を用いて座標を表す例
type Coordinates = Record<string, number>;

const point: Coordinates = {
  x: 10,
  y: 5, 
};

console.log(`(x, y) = (${point.x}, ${point.y})`);

座標の変数名は string 型のキーで表現し、座標の値は number 型の値に対応付けして表現しています。座標の変数名は任意の文字列を指定できるため、オブジェクトリテラルでキーを指定したり、プロパティとしてアクセスできます。

Vue Router の RouteParams 型のキーは string 型で、値の実体は string|string[] のユニオン型で定義されています。
RouteParams 型は Record<string, string|string[]> 型で定義することで、任意のパラメーター名と値の対応を表しています。

https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type
https://jp-seemore.com/web/13889/

まとめ

本記事のまとめは次の通りです。

  • Vue Router で route parameter を string 型に変換する方法を紹介
  • Vue Router の route parameter の型定義について説明
    • Record<Keys, Type> について説明

解決方法とあわせて型定義についても確認したことで Record<Keys, Type> について学ぶ良い機会になりました。

参考文献

https://stackoverflow.com/questions/70996660/is-there-way-to-type-route-params-in-vue-js
https://router.vuejs.org/api/#RouteParams

Vue・Nuxt 情報が集まる広場 / Plaza for Vue・Nuxt.

Discussion