1. ホーム
  2. typescript

[解決済み] 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で公開されているので、間違いなくこれはバグです。 pPromise<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);
    });
};