如何约束 Promise 实例的 catch 语句的回调函数的参数的类型?

新手上路,请多包涵
function foo() {
  const p: Promise<number> = new Promise((res, rej) => {
    const n = Math.random()
    n > 0.5 ? res(n) : rej(new Error(n))
  })
  return p
}
foo()
  .then((n) => {})
  .catch((error) => {
    // 这里error的类型是any,如何处理foo函数使得这里的error是预期的类型
  })
阅读 1.7k
2 个回答
foo()
  .then((n) => {})
  .catch((error:string) => {
    // 这里error可以自己手动赋予类型
  })

如果是为了获取reject的值就这样

foo()
    .then((n) => { })
    .catch((error) => {
        const errorNumber = Number.parseFloat((error instanceof Error) ? error.message : error);
        if (Number.isFinite(errorNumber)) {
            console.error("error number:", errorNumber);
        } else {
            console.error(error);
        }
    })

如果是想在代码提示阶段限制error的类型,大概率是不行的,因为js它不像java可以写多个catch,只能写一个,error的类型在js中也是any,ts也没法提前判断