如何在Typescript中使Promise类型安全?

问题描述 投票:1回答:2

承诺在Typescript中似乎是类型不安全的。这个简单的示例显示resolve接受undefined,而Promise.then似乎可以推断参数为非undefined

function f() {
  return new Promise<number>((resolve) => {
    resolve(undefined)
  })
}

f().then((value) => { 
  console.log(value+1)
})

((在我当前的项目中尝试http://www.staging-typescript.org/play)。

显然,Typescript推断value的类型为number,而不是number | PromiseLike<number> | undefined

这可能是当前的Typescript问题,但是...

什么是适当的解决方法?我希望编译器警告我value可能未定义!

一个非常简单的解决方案可能是编写

f().then((value:number | undefined) => { 
  console.log(value+1) // now I have: Object is possibly 'undefined'
})

但这需要我在每个呼叫站点积极思考问题。

javascript typescript es6-promise
2个回答
0
投票

遗憾的是,当前的TypeScript无法做到这一点。但是,以更多的冗长为代价,您可以将代码更改为如下所示:

const iReturnUndefined = () => undefined

function f() {
    return new Promise<number>((resolve) => {
        const resolvedVal: number = iReturnUndefined() // Type 'undefined' is not assignable to type 'number'.

        resolve(resolvedVal)
    })
}

TypeScript playground


0
投票

您可以手动设置resolve函数的签名。这样一来,您就无法传递未定义的内容。

function f() {
return new Promise<number>((resolve: (arg0: number) => void) => {    
  resolve(undefined) // Argument of type 'undefined' is not assignable to parameter of type 'number'.
})

}

TypeScript playground

© www.soinside.com 2019 - 2024. All rights reserved.