不努力code 2023-08-30 16:42 采纳率: 60%
浏览 7

ts中Promise返回值二选一

ts中Promise返回值二选一

async function test<T extends unknown>(promise: Promise<T>): Promise<[any, null] | [null, T]> {
  try {
    const data = await promise
    return Promise.resolve([null, data])
  } catch (err) {
    return Promise.resolve([err, null])
  }
}

async function main() {
  const [err, res] = await test<number>(new Promise(() => 123))
  if (err) return
  console.log(res) //推导的类型为:const res: number | null
  //  我希望的是,如果err存在,res为null
  //如果err不存在,res为T
}


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-30 19:11
    关注

    【以下回答由 GPT 生成】

    这个问题可以通过类型断言来解决。在main函数中,我们可以手动指定res的类型为T,当err不存在时。

    以下是修改后的代码:

    async function test<T extends unknown>(promise: Promise<T>): Promise<[any, null] | [null, T]> {
      try {
        const data = await promise
        return Promise.resolve([null, data])
      } catch (err) {
        return Promise.resolve([err, null])
      }
    }
    
    async function main() {
      const [err, res] = await test<number>(new Promise(() => 123))
      if (err) return
    
      console.log(res as number) // 类型断言为 number 类型
    }
    

    console.log语句中,我们使用了类型断言as number来指定res的类型为number。这样可以让TypeScript正确推断出res的类型。

    这就是如何修改代码来实现你期望的功能。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月30日

悬赏问题

  • ¥15 请问为什么我配置IPsec后PC1 ping不通 PC2,抓包出来数据包也并没有被加密
  • ¥200 求博主教我搞定neo4j简易问答系统,有偿
  • ¥15 nginx的使用与作用
  • ¥100 关于#VijeoCitect#的问题,如何解决?(标签-ar|关键词-数据类型)
  • ¥15 一个矿井排水监控系统的plc梯形图,求各程序段都是什么意思
  • ¥15 ensp路由器启动不了一直报#
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了