Closed6

API Factory

hanetsukihanetsuki
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')
hanetsukihanetsuki
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]>
}

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

hanetsukihanetsuki

ちなみに、

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

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

hanetsukihanetsuki

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

このスクラップは2021/10/12にクローズされました