如何在TypeScript中更改Promise < >的结果类型

如何在TypeScript中更改Promise < >的结果类型

问题描述:

对于我构建的一些Typescript方法,通常需要承诺的异步性,但我不需要承诺返回值(概念上讲)。一个简单的例子可能是调用initLanguageStrings()方法来加载应用程序使用的语言字符串。语言字符串被放置到全局结构中,但承诺仍然是必要的,以确保在加载语言字符串之前应用程序不会继续。如何在TypeScript中更改Promise < >的结果类型

将此场景重复两次或三次,然后将所有初始化工作绑定到一组承诺中,这些承诺必须在继续之前全部完成。因此,我使用Promise.all,像这样(举例):

initialiseApp(): Promise<void> 
{ 
    let promises: Promise<any>[ ] = [ ]; 

    promises.push(this.initLanguageStrings()); 
    promises.push(this.initModelData()); 
    promises.push(this.initUserInfo()); 

    return Promise.all(promises); 
} 

上面的代码将不实际编译(TS1.5/1.6),因为Promise.all()返回无极<任何[]>不能保证< void>。

所以我写出来是这样的:

return new Promise((resolve, reject) => { 
    Promise.all(promises) 
     .then((dummy: any[ ]) => { 
     resolve(); 
     });   
}); 

我相信这是语义正确的做法,因为“执行”实际上保持隐藏,而“内的承诺”(从Promise.all)从不“逃避”initialiseApp()的调用者。

但另一方面,我觉得这种方法很丑,并希望找到一个更好的方法来做到这一点,因为返回Promise < void>正在成为我的一个常见模式。

有没有更好的方法来实现我想要做的?

编译器将允许:

return Promise.all(promises).then(() => { }); 

但它也给我的印象是“刁钻”的和丑陋。

因为返回无极<无效>正在成为一个相当普遍的模式,我

您可以使用一个类型断言

initialiseApp(): Promise<void> 
{ 
    let promises: Promise<any>[ ] = [ ]; 

    promises.push(this.initLanguageStrings()); 
    promises.push(this.initModelData()); 
    promises.push(this.initUserInfo()); 

    return Promise.all(promises) as Promise<void>; 
} 

注意:当您使用断言你本质上是在这种情况下向编译器说谎。在编译器认为是一件事而运行时看到另一件事的时候,要小心一些错误。

return Promise.all(promises).then(() => { });

这是正确办法做到这一点。 运行时间匹配什么编译器已推断。如果你想要一个Promise<void> ...那么作出Promise<void>这就是这个代码示例。

+0

我看到使用cast(type assertion)的缺点是,我们不仅向编译器说谎,而且结果会将函数“调出”给调用者。换句话说,initialiseApp的调用者实际上会收到来自Promise的任何[]。尽管该方法表示什么都不应该返回。 – Kevmeister68