LoginSignup
4
0

More than 1 year has passed since last update.

Nuxt3で$fetchのレスポンスに型をつけるには

Posted at

Nuxt3だとaxiosではなく$fetchやuseFetchの利用が推奨されているみたいです。
その使い方の備忘録として。
2022/06/28時点での情報です。もっといい方法あるよって方はコメントまで!

作るもの

あらかじめ郵便番号を指定してその都道府県を返すだけのもの。

ディレクトリ構造

必要なものだけピックアップしてます。

.
├── app.vue
├── interface
│   └── address.ts
└── server
    └── api
        └── getAddress.ts

interface

zipcloudにレスポンスフィールドが記載されてるのでその通りのinterfaceを用意します。

interface/address.ts
export interface Address {
  message: string,
  results: AddressDetail[],
  status: number
}
export interface AddressDetail {
  address1: string,
  address2: string,
  address3: string,
  kana1: string,
  kana2: string,
  kana3: string,
  prefcode: string,
  zipcode: string
}

server

serverの詳しい説明は公式ドキュメントにて

server/api/getAddress.ts
import { Address } from "~~/interface/address"

export default defineEventHandler(async(event) => {
  const response = await $fetch<string>('/api/search',{
    baseURL: "https://zipcloud.ibsnet.co.jp",
    params: {zipcode:1000000}
  })
  const result = JSON.parse(response) as Address

  return {result}
})

レスポンスの型にAddressを指定するとVSCode上ではAddressで取得出来てそうなんですが、実行後に型を確認するとstringになってしまい苦戦。
解決策としてここでは$fetchのレスポンスをstringで受け取って、JSON.parseでキャストしてます。

page

ページ側は表示させるだけです。

app.vue
<template>
  <div>
    <p>{{api.result.results[0].address1}}</p>
  </div>
</template>

<script setup lang="ts">
const {data:api} = await useFetch('/api/getAddress')
</script>

実行

ちゃんと型がついた状態で取れてますね。
image.png

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0