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
}


【以下回答由 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的类型。

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



【相关推荐】



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