Closed6

API Factory

const userApiRepository = (axios: any) => {
  const END_POINT = '/user'
  return {
    show(id: string) {
      axios.get(`${END_POINT}/${id}`)
    },
    update(id: string, payload: any) {
      axios.put(`${END_POINT}/${id}`, payload)
    }
  }
}

const companyApiRepository = (axios: any) => {
  const END_POINT = '/company'
  return {
    show(id: string) {
      axios.get(`${END_POINT}/${id}`)
    }
  }
}

const repositories = {
  user: userApiRepository,
  company: companyApiRepository
}

export const apiFactory = <K extends keyof typeof repositories>(repoKey: K) => {
  const Axios: any = {}
  const repository = repositories[repoKey]
  return repository(Axios)
}

apiFactory('user')

型補完が効かなくて悲しい😢

本当はupdateも出て欲しい

export const apiFactory = <K extends keyof typeof repositories>(repoKey: K) => {
  const Axios: any = {}
  const repository = repositories[repoKey]
  return repository(Axios) as ReturnType<typeof repositories[K]>
}

上記のように戻り値に対して型定義することで期待していた型定義になることが確認できた。

ちなみに、

export const apiFactory = <K extends keyof typeof repositories>(repoKey: K): ReturnType<typeof repositories[K]> => {
  const Axios: any = {}
  const repository = repositories[repoKey]
  return repository(Axios)
}

だとエラーになる。なんでだろうなぁ...

aspidaを拡張する形でuseApiみたいな感じでこの形式を採用するのはありかなと思った。

今度ラップしてみよう。

このスクラップは2021/10/11にクローズされました
ログインするとコメントできます