带有 Promise 的 typescript 响应类型

Posted

技术标签:

【中文标题】带有 Promise 的 typescript 响应类型【英文标题】:typescript type of response with Promise 【发布时间】:2021-07-26 15:19:26 【问题描述】:

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

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 中给了我这个错误: 不安全的成员访问 .response 对 any 值。

【问题讨论】:

vm 是从哪里来的?请提供一个最低限度的可重现示例。 【参考方案1】:

“任何值上的不安全成员访问 .$axios。”只是意味着,没有适当的 vm 类型定义,因此您应该自己创建一个或(首选)获取一个已经完成它的包。

【讨论】:

对不起,好的错误是:Unsafe member access .response on an any value。 这似乎是您捕获的错误的缺失类型。我的建议是检查所有错误并首先修复它们。在缺少的地方添加类型,你得到的错误会更有用。 @franfrLor 您的函数 isAxiosError 没有有效的返回类型(应该是布尔值)并且您没有将 const axiosError = e 转换为您定义的类型【参考方案2】:

对不起,我是打字稿的新手 我这样做了,你怎么看?

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
      )
    )

【讨论】:

以上是关于带有 Promise 的 typescript 响应类型的主要内容,如果未能解决你的问题,请参考以下文章

Typescript:Promise 的子类/扩展:不引用 Promise 兼容的构造函数值

typescript async函数必需返回promise么

如何等待 JavaScript/TypeScript 中的 Promise 列表?

Promise.reject的TypeScript错误

TypeScript Promise 语法

使用 Promise 的 TypeScript 异步类型保护