首页 > 解决方案 > 如何在 Typescript 中使 Promise 类型安全?

问题描述

Promise 在 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 推断的类型valuenumber,而不是number | PromiseLike<number> | undefined

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

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

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

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

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

编辑(当前状态):按照@JerMah 给出的解决方案,我将Promise创建包装在一个通用函数中:

function makePromise<T>(executor: (resolve: (value: T) => void,
                                   reject: (reason?: any) => void) => void)
{
  return new Promise<T>(executor);
}

标签: javascripttypescriptes6-promise

解决方案


您可以手动设置解析函数的签名。这样你就不能传递它未定义。

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 游乐场


推荐阅读