TypeScript:错误TS2345在对话框中返回Promise.all()

时间:2018-01-12 12:42:57

标签: typescript promise dialog

我在TypeScript中有以下功能:

    private async deleteSelectedLuminaires (): Promise<any[]> {
    return this.dialogService.open({ viewModel: DeleteLuminaire, model: 'Cancel or Ok', lock: false })
    .whenClosed((response) => {
      if (!response.wasCancelled) {
        const requests = this.selectedSerials
          .map(async (serial) => this.luminaireApi.removeLuminaire({ serial }))

        return Promise.all(requests)
      }
    })
  }

this.luminaireApi.removeLuminaire函数返回Promise&lt;无效&gt;。 在这个函数中,我通过Dialog服务提出一个问题来删除一些项目。 当我删除对话框时,一切正常,但上面的代码给了我以下错误:

  

错误TS2345:类型的参数'(响应:DialogCloseResult)=&gt;   承诺| undefined'不能分配给类型的参数   '(value:DialogCloseResult)=&gt;任何[] | PromiseLike”。类型   '承诺| undefined'不能赋值为'any [] |   PromiseLike”。       类型'undefined'不是   可分配给'any [] | PromiseLike”。

我确定问题是一起使用对话框和Promise.all,但我不知道为什么。 你能帮我解决一下吗?

2 个答案:

答案 0 :(得分:1)

看起来你有一个方法可以返回 一个Promiseundefined(即你在代码分支中缺少一个return语句)。

这就是(response: DialogCloseResult) => Promise | undefined所指的内容。

您的问题的解决方案是确保处理DialogCloseResult的方法仅返回Promise,而不是未定义。如果您无法控制该签名,则可能需要类型保护,或在该返回值上键入断言。

Type Guard

if (typeof returnValue !== 'undefined') {
    // Then it is a promise here

}

键入断言

promiseValue = <Promise>returnValue;

答案 1 :(得分:0)

我解决了,正如你在这里看到的那样:

private async deleteSelectedLuminaires (): Promise<any> {
    let promises: Promise<any>

    return this.dialogService.open({ viewModel: DeleteEntries, model: 'Cancel or Ok', lock: false })
      .whenClosed(async (response) => {
        if (!response.wasCancelled) {
          promises = Promise.all(this.selectedSerials
            .map(async (serial) => this.luminaireApi.removeLuminaire({ serial })))
        }

        return promises
      })
  }