web-dev-qa-db-ja.com

プロパティが最終的にタイプPromiseにありません

私はこの問題を自分で解決できると確信していますが、それが他の誰かを助けることができれば、他の誰かと共有して時間を節約したいです。

このエラーを取り除くには、es6-promiseライブラリを追加する必要がありました

Promise only result to a type, but is only used as a value here.

promise.allを使おうとしたとき( この説明 を参照)。今までは問題なく動作しましたが、MongoDBのPromiseを使用しようとするとエラーが発生します。

Promise<whatever> is not assignable to Promise<any>
    Property 'finally' is missing in type Promise<whatever>

es6-promiseのこの問題 (正しく理解できた場合)によると、新しいfinallyプロパティは互換性を壊しています。 Promise Mongoのリターンにはありますが、es6-promiseからインポートしたものにはありません。

何か案が?

8
Loic Coenen

私はfinallyシムがPromiseの互換性を壊していた リンクされた問題 と指摘した人です。これが注目を集めているのを見てうれしいです。ここにいくつかのオプションがあります:

1. TypeScriptコアライブラリのタイプに完全に依存する

tsconfig.json

{
    "compilerOptions": {
        "lib": ["DOM","ES5","ScriptHost", "es2018.promise"]
    }
}

シムをインストールし、アプリの開始時にポリフィルを1回実行します。それ以降は、es6-promiseからPromiseクラスをインポートし続けるのではなく、グローバルPromiseオブジェクトを使用します。これが最も相互運用可能な方法であることがわかりました。

npm install --save es6-promise@latest

es6-promiseは、最近のいくつかのリリースでは、TypeScriptの組み込みPromise libsの型指定と競合する独自の型指定をバンドルしています。

2. finallyシムを含まない古いバージョンのes6-promiseを使用します

注:もちろん、これはfinallyを使用できないことを意味します

{
    "compilerOptions": {
        "lib": ["DOM","ES5","ScriptHost"]
    }
}

finallyを導入する前のes6-promiseの最新バージョンをインストールし、それらの入力を使用します。

npm install --save [email protected] && npm install --save-dev @types/[email protected]

(または、その他の入力を省略して、es2015.promisecompilerOptions.libtsconfig.json配列に追加します。)

4
Jamie Birch

Promiseの正しい型定義だけが必要な場合は、TypeScriptに付属の組み込み定義を使用できます(実際に使用しているプロミスにはfinallyメソッドは期待どおりです)。

これを行うには、es6-promiseプロジェクトを作成し、tsconfigでlibを次のように変更します。

{
    ....
    "lib": ["es5","es2015.promise","dom", "scripthost"] 
    ....
}