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

时间:2015-10-06 02:21:32

标签: typescript promise es6-promise typescript1.5 typescript1.6

对于我构建的一些Typescript方法,我经常需要一个promise的异步性,但我不需要承诺返回一个值(从概念上讲)。一个简单的示例可能是调用initLanguageStrings()方法来加载应用程序使用的语言字符串。语言字符串被放置在一个全局结构中,但仍然需要承诺,以确保在加载语言字符串之后应用程序不会继续。

多次这种情况两到三次然后我将所有初始化工作绑定到一组承诺中,这些承诺必须在继续之前完成所有承诺。因此我使用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()返回Promise&lt;任何[]&gt;不承诺&lt;无效&gt;。

所以我最终写的是:

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

我认为这在语义上是正确的方法,因为“实现”实际上仍然是隐藏的,而“内部承诺”(来自Promise.all)永远不会“逃脱”到initialiseApp()的调用者。

但另一方面,我发现这种方法很丑陋,并希望找到一种更好的方法来做到这一点,因为返回Promise&lt;无效&gt;对我来说正在变得非常普遍。

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

编译器将允许:

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

但它让我感到“狡猾”和丑陋。

1 个答案:

答案 0 :(得分:8)

  

因为返回Promise&lt;无效&gt;对我来说正在成为一种非常普遍的模式

您可以使用类型断言

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> 就是这个代码示例所做的。