在TypeScript中定义Promise返回值

11,794 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

我有一个异步函数,试图返回一个object或null。

但是我在定义类型时出错了。

如何定义此数据类型?

const checkIsValidConnection = async (number: string): Promise<string | null> => {
  const defaultConnection = await GetDefaultConnection()
  const wbot = getWbot(defaultConnection.id)
  const contactId = await wbot.getNumberId(`${number}`)
  return contactId
}

export default checkIsValidConnection

类型“ContactId | null”不可分配给类型“string | null”。类型“ContactId”不可分配给类型“string”。

首先要在tsconfig.json中配置ES2015.promise的lib,不然TypeScript无法支持Promise

接下来随意定义一个异步函数

export default function onLoginFn(param) {
   return new Promise(resolve => {
       axios.get('/login', param).then(r => {
          resolve(r) 
       }
   }
}

然后用TypeScript声明文件定义期望返回的数据类型

declare namespace Service {
   interface login {
      id: number
      name: string
      <T = any> (date: T): Promise<T>
   }
}

最后再结合之前的异步函数

export default function login(): Promise<Service.login> {
   return new Promise(resolve => {
      axios.get('/login', param).then(r => {
         resolve(r) 
      }
   }
}

只是多了个Promise返回值定义,但可以从then方法中看到返回值的代码提示了,还是很方便的。

总结

  • 当Promise的回调函数返回非Promise对象的值时,thencatch都生成一个状态为fulfilled的Promise对象,并把该返回值传入Promise链的下一环节。
  • 当Promise的回调函数返回值为Promise对象时,生成的Promise对象的状态由被返回的Promise对象决定,传入Promise链下一环节的值也由这个被返回的Promise决定。
  • 当Promise的回调函数中抛出错误时,thencatch都生成一个状态为rejected的Promise对象,并把抛出的错误对象传入Promise链的下一环节。

最后

公众号:小何成长,佛系更文,都是自己曾经踩过的坑或者是学到的东西

有兴趣的小伙伴欢迎关注我哦,我是:何小玍。大家一起进步鸭