【问题标题】:TypeScript: Error TS2345 to return Promise.all() in a DialogTypeScript:错误 TS2345 在对话框中返回 Promise.all()
【发布时间】:2018-06-21 22:22:42
【问题描述】:

我在 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。 在此功能中,我通过 Dialog 服务提出问题以删除一些项目。 当我删除对话框时,一切正常,但上面的代码给了我以下错误:

错误 TS2345: 类型参数 '(response: DialogCloseResult) => 承诺 | undefined' 不可分配给类型参数 '(值:DialogCloseResult)=> 任何[] |许诺”。类型 '承诺 | undefined' 不可分配给类型 'any[] | 许诺”。 类型“未定义”不是 可分配给类型 'any[] | PromiseLike'。

我确定问题在于同时使用 dialog 和 Promise.all,但我不知道为什么。 你能帮我解决吗?

【问题讨论】:

    标签: typescript promise dialog


    【解决方案1】:

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

    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
          })
      }
    

    【讨论】:

      【解决方案2】:

      您似乎有一个方法返回任一 Promiseundefined(即您在代码分支中缺少返回语句)。

      这就是(response: DialogCloseResult) =&gt; Promise | undefined 所指的。

      解决问题的方法是确保处理 DialogCloseResult 的方法只返回一个 Promise,而不是未定义的。如果您无法控制该签名,则可能需要类型保护,或对该返回值进行类型断言。

      类型保护

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

      类型断言

      promiseValue = <Promise>returnValue;
      

      【讨论】:

        猜你喜欢
        • 2012-06-16
        • 2017-05-27
        • 1970-01-01
        • 2019-06-22
        • 2023-02-23
        • 2019-07-17
        • 1970-01-01
        • 2019-07-28
        • 2012-10-29
        相关资源
        最近更新 更多