2017-05-09 4 views
3
における非同期機能の約束

を返す:それは、これら2つの関数はJavaScriptで同じ動作を持っていることを私の理解だ活字体

const whatever1 =(): Promise<number> => { 
    return new Promise((resolve) => { 
     resolve(4); 
    }); 
}; 

const whatever2 = async(): Promise<number> => { 
    return new Promise((resolve) => { 
     resolve(4); 
    }); 
}; 

しかし、活字体が第二1を好きではないようだ、それは言う:

Type '{}' is not assignable to type 'number'. 

これはTypeScriptのバグですか、私は非同期関数について何か誤解していますか?

答えて

9

複雑です。

まず第一に、このコード

const p = new Promise((resolve) => { 
    resolve(4); 
}); 

pのタイプはPromise<{}>ように推測されます。これはtypescript githubにはopen issueがあるので、おそらくこれはバグです。明らかに(人間のために)pPromise<number>であるべきです。

基本的に約束を有するプロパティのみがthen方法であり、thentypescript rules for function types compatibilityに応じてこれら二つの約束タイプに互換性があるので、次に、Promise<{}>は、Promise<number>と互換性があります。だからこそ、whatever1にエラーはありません。

しかし{}がobvioulsy numberと互換性がないためasyncの目的は、あなたが実際の値ではなく、約束を扱っていることをふりをして、あなたがwhatever2でエラーを取得することです。

したがって、asyncの動作は同じですが、現在typescriptをコンパイルするにはいくつかの回避策が必要です。次のような約束事を作成するときに、明示的な一般的な議論を提供することができます:

const whatever2 = async(): Promise<number> => { 
    return new Promise<number>((resolve) => { 
     resolve(4); 
    }); 
}; 
3

new Promise((resolve)...を実行すると、new Promise<number>((resolve)を使用したはずなので、推定される型はPromise<{}>でした。

この問題は、asyncキーワードが追加されたときにのみ強調表示されています。この問題をTSチームon GitHubに報告することをおすすめします。

この問題を回避する方法はたくさんあります。あなたはすべてのこれらの関数の推論された型が() => Promise<number>であることを確認することができますあなたのIDEで

const whatever1 =() => { 
    return new Promise<number>((resolve) => { 
     resolve(4); 
    }); 
}; 

const whatever2 = async() => { 
    return new Promise<number>((resolve) => { 
     resolve(4); 
    }); 
}; 

const whatever3 = async() => { 
    return await new Promise<number>((resolve) => { 
     resolve(4); 
    }); 
}; 

const whatever4 = async() => { 
    return Promise.resolve(4); 
}; 

const whatever5 = async() => { 
    return await Promise.resolve(4); 
}; 

const whatever6 = async() => Promise.resolve(4); 

const whatever7 = async() => await Promise.resolve(4); 

:すべての以下の機能は同じ動作をします。

関連する問題