2017-04-24 127 views
3

我期望類型void []與void類型兼容。具體來說,使用Promise.all時。類型Void []數組不可分配給類型void

class Foo { 
    delete(): Promise<void> { 
    // do delete 
    return Promise.resolve(); 
    } 
    deleteMany(list: Foo[]): Promise<void> { 
    return Promise.all(list.map((x) => x.delete())); 
    } 

打字稿錯誤:

'Type 'Promise<void[]>' is not assignable to type 'Promise<void>'. Type 'void[]' is not assignable to type 'void'.'

我可以解決這個兩個方法,我知道的:

  1. 馬克deleteMany爲返回無極<無效[] >。
  2. Promise chain to Promise.all,返回已解決的承諾。例如

    return Promise.all(list.map((x) => x.delete())).then(() => Promise.resolve()); 
    

第二個更糟糕的是,因爲代碼位在JavaScript執行,但第一個是混亂到開發商。 Typescript對Promise.all有沒有很好的支持,還是從文檔中省略了?任何人找到更好的解決方案

+1

爲什麼不把'deleteMany'標記爲返回'Promise '?這不是一個可憐的支持,這是一個'Promise.all'調用返回... –

+0

由於@MikeMcCaughan建議..我同意.. Promise.all返回一個數組類型的承諾,在這種情況下,它是無效的 – radix

+0

第3選項:只需完全關閉返回類型。如果使用不正確,編譯器會推斷它並引發錯誤。去1或3,2沒有意義。 –

回答

4

1(Mark deleteMany返回Promise<void[]>)至少對我來說絕對沒問題。

但是,您可以使用async/await如果你真的想返回Promise<void>

class Foo { 
    delete(): Promise<void> { 
    // do delete 
    return Promise.resolve(); 
    } 
    async deleteMany(list: Foo[]): Promise<void> { 
    await Promise.all(list.map((x) => x.delete())); 
    } 

功能的行爲完全一樣。

2

voidincompatible with any other type exceptnullundefined設計,因此它與void[]不兼容。

您可以使用Promise<{}>作爲deleteMany的結果類型,即允許解析爲空對象。它的工作原理,因爲空的對象類型沒有屬性(因此它不能有意義以任何方式使用),並且,因爲它沒有屬性(再次),它可以分配幾乎所有的東西,包括void[]

class Foo { 
    delete(): Promise<void> { 
     // do delete 
     return Promise.resolve(); 
    } 
    deleteMany(list: Foo[]): Promise<{}> { 
     return Promise.all(list.map((x) => x.delete())); 
    } 
} 
相關問題