首页 > 解决方案 > 带有 Promise 的 typescript 响应类型

问题描述

如何设置响应变量的类型?

import axios from 'axios'

function postVueX (commit: (mutation: string, data: unknown) => void,
  dispatch: (mutation: string, data: string, options?: { root: boolean }) => void,
  url: string,
  data: unknown,
  mutation: string,
  emptyResult: unknown,
  method: () => void): Promise<void> {
  return Promise.resolve()
    .then(() => {
      return axios.post(url, data)
    })
    .then(response => {
      if (response) {
        if (mutation) {
          commit(mutation, response.data)
        }
        if (method) {
          method(response.data)
        }
      }
    }).catch(e => {
      if (mutation) {
        commit(mutation, emptyResult)
      }
      dispatch('notify/error', e.response.data.message, {
        root: true
      })
    })
}

linter 在 catch 中给了我这个错误: Unsafe member access .response on an anyvalue。

标签: typescriptvue.js

解决方案


抱歉,我是打字稿的新手,我这样做了,您怎么看?

export interface Erreur {
  message: string;
}

function isAxiosError (error: unknown): error is AxiosError {
  return (error as AxiosError).isAxiosError !== undefined
}

function postVueX (commit: (mutation: string, data: unknown) => void,
  dispatch: (mutation: string, data: string, options?: { root: boolean }) => void,
  url: string,
  data: unknown,
  mutation: string,
  emptyResult: unknown,
  method: (data: unknown) => void): Promise<void> {
  return Promise.resolve()
    .then(() => {
      return axios.post(url, data)
    })
    .then(response => {
      if (response) {
        if (mutation) {
          commit(mutation, response.data)
        }
        if (method) {
          method(response.data)
        }
      }
    }).catch(e => {
      let erreur = 'Erreur non trouvée'
      if (isAxiosError(e)) {
        const axiosError = e
        if (axiosError.response) {
          erreur = (<Erreur>(axiosError.response.data)).message
        }
      } else if (e instanceof Error) {
        erreur = e.message
      }
      if (mutation) {
        commit(mutation, emptyResult)
      }
      dispatch('notify/error', erreur, {
        root: true
      })
    })
}

推荐阅读