web-dev-qa-db-fra.com

La propriété manque enfin dans le type Promise

Je suis sûr que je serai en mesure de résoudre ce problème par moi-même, mais si cela peut aider quelqu'un d'autre, je veux partager et faire gagner du temps à quelqu'un d'autre.

J'ai dû ajouter le es6-promise bibliothèque pour se débarrasser de cette erreur

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

quand j'essayais d'utiliser Promise.all (voir cette discussion ). Cela a bien fonctionné jusqu'à présent, je reçois une erreur lorsque j'essaie d'utiliser une promesse de MongoDB.

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

Selon ce problème sur es6-promise (si j'ai bien compris), la nouvelle propriété enfin brise la compatibilité. Il est là sur le retour de Promise Mongo mais pas sur celui que j'ai importé de es6-promise.

Une idée?

7
Loic Coenen

Je suis celui qui a noté que le shim finally cassait la compatibilité de Promise sur ce problème lié . Ravi de voir cela attirer l'attention. Voici quelques options:

1. Comptez uniquement sur les typages de la bibliothèque principale de TypeScript

tsconfig.json

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

Installez le shim, exécutez le polyfill une fois au début de votre application et utilisez ensuite l'objet global Promise plutôt que de continuer à importer la classe Promise depuis es6-promise. J'ai trouvé que c'était le moyen le plus interopérable.

npm install --save es6-promise@latest

Notez que es6-promise a, pour les dernières versions, regroupé ses propres typages qui entrent en conflit avec les typages des librairies Promise intégrées de TypeScript.

2. Utilisez une ancienne version de es6-promise qui n'inclut pas le finally shim

Remarque: bien sûr, cela signifie que vous ne pouvez pas utiliser finally

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

Installez la dernière version de es6-promise avant d'introduire finally, et utilisez ces saisies:

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

(Ou sinon, omettez ces saisies et ajoutez es2015.promise à ton compilerOptions.lib tableau dans tsconfig.json.)

3
Jamie Birch

Si tout ce dont vous avez besoin est une définition de type correcte pour un Promise, vous pouvez simplement utiliser les définitions intégrées fournies avec TypeScript (je le dis parce que vous notez que la promesse avec laquelle vous travaillez a le finally méthode comme prévu).

Pour ce faire, supprimez es6-promise formez votre projet et dans tsconfig changez votre lib en:

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