[解決済み] TypeScriptの非同期関数でプロミスを返す
2022-03-11 08:09:31
質問
この2つの関数は、JavaScriptでは同じ動作になるという理解でいいのでしょうか?
const whatever1 = (): Promise<number> => {
return new Promise((resolve) => {
resolve(4);
});
};
const whatever2 = async (): Promise<number> => {
return new Promise((resolve) => {
resolve(4);
});
};
しかし、TypeScriptは2番目のものを好まないようだ、という。
Type '{}' is not assignable to type 'number'.
これはTypeScriptのバグなのか、それとも私が非同期関数について何か誤解しているのでしょうか?
解決方法は?
複雑なんです。
まず、このコードで
const p = new Promise((resolve) => {
resolve(4);
});
のタイプは
p
と推論されます。
Promise<{}>
. そこには
オープンイシュー
この件に関しては、typescriptのgithubで公開されているので、間違いなくこれはバグです。
p
は
Promise<number>
.
では
Promise<{}>
とは互換性があります。
Promise<number>
なぜなら、基本的にプロミスが持つ唯一のプロパティは
then
メソッド、そして
then
に従い、この2つのプロミスタイプに互換性があります。
関数型の互換性に関するタイプスクリプトの規則
. そのため
whatever1
.
しかし、その目的は
async
は、約束ではなく実際の値を扱っているふりをするためのものであり、そうすると
whatever2
なぜなら
{}
とは明らかに互換性がありません。
number
.
そのため
async
の動作は同じですが、現状ではtypescriptにコンパイルさせるために何らかの回避策が必要です。このようにプロミスを作成する際に明示的な総称引数を与えるだけで良いのです。
const whatever2 = async (): Promise<number> => {
return new Promise<number>((resolve) => {
resolve(4);
});
};
関連
-
[解決済み] error TS2339: Property 'x' does not exist on type 'Y'.
-
[解決済み] ts1206 デコレーターはここでは無効です、Angular 2。
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み】TypeScriptのインターフェースと型について
-
[解決済み】タイプライター。TS7006: パラメータ 'xxx' は暗黙のうちに 'any' 型を持つ。
-
[解決済み] コンストラクトシグネチャを持つインターフェースはどのように機能するのですか?
-
[解決済み] TypeScriptの自由形式関数引数
-
[解決済み] TypeScriptのarrow関数で戻り値の型を指定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Typescript : require文はimport文の一部ではない
-
[解決済み】tsconfigファイルにおけるesModuleInteropの理解
-
[解決済み] タイプスクリプトのエラーです。TS7053 要素が暗黙のうちに 'any' 型を持っています。
-
[解決済み] タイプスクリプトのコンパイルで「tsc コマンドが見つかりません。
-
[解決済み] エラー TS2322: タイプ 'Object[]' はタイプ '[Object]' に割り当てられません。
-
[解決済み] eslintをtypescriptで使用する - モジュールへのパスを解決できない
-
[解決済み] TypeScriptの「as const」の意味とその使用例とは?
-
[解決済み] Jestで関数をモックする方法
-
[解決済み] TypeScriptの "*.d.ts "について
-
[解決済み】タイプからプロパティを除外する