2016-08-30 75 views
14

因此,我正在用打字稿学习Angular 2。如何使用TypeScript返回适当的承诺

我到达了写一个嘲笑的服务(我相信)应该返回一个承诺,如果该服务获得对象成功,并返回一个错误,如果任何事情发生的一个点。

我已经试过下面的代码,但看起来它不是一个写入语法的打字稿。

更新代码:

saveMyClass(updatedMyClass: MyClass){ 
     //saving MyClass using http service 
     //return the saved MyClass or error 
     var savedMyClass : MyClass = someLogicThatReturnsTheSavedObject(updatedMyClass); 
     if(isSomeCondition) 
      return Promise.reject(new Error('No reason but to reject')); 
     else 
      return new Promise<MyClass>(resolve => {setTimeout(()=>resolve(savedMyClass),1500 )} ); 
    } 

但我惊讶的是,打字稿抱怨说“没有最好常见类型的返回公式中存在的”。

什么应该是正确的代码?所以我可以使用我的组件来消费,如果返回适当的MyClass,并且反映错误(如果存在服务的话)。

感谢

+1

不要用打字机标记javascript!打字稿不是纯粹的javascript – Endless

+0

你试过吗? https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/es6-promise/es6-promise.d.ts –

+0

假设saveMyClass是一个函数试试这个 function saveMyClass(updatedMyClass:MyClass):any {....代码在这里......} –

回答

22

它被认为是一个很好的做法,嵌入整个函数体Promise构造函数中,所以应任何错误发生,将它转换为拒绝。在这种情况下,我相信它也解决了你的问题。

saveMyClass(updatedMyClass: MyClass) { 
    return new Promise<Package>((resolve, reject) => { 
     //saving MyClass using http service 
     //return the saved MyClass or error 
     var savedPackage : Package = updatedPackage; 
     if (isSomeCondition) { 
      throw new Error('No reason but to reject'); 
     } 

     setTimeout(() => { 
      resolve(savedPackage); 
     }, 1500); 
    }); 
} 
+0

setTimeout永远不应该用来控制这样的事情,但由于打字稿和JavaScript从根本上打破了,不管它有多荒谬,你都可以这样做。 – CarComp

+1

@CarComp此代码是OPs问题的直接答案,无需任何不必要的修改。 –

+0

依靠超时依然不是好习惯。 – CarComp