typescript - Egenskapen finally saknas i typen Promise


Jag är ganska säker på att jag kommer att kunna lösa det här problemet själv, men om det kan hjälpa någon annan vill jag dela och spara tid för någon annan.

Jag var tvungen att lägga till es6-promise-biblioteket för att bli av med detta fel

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

när jag försökte använda Promise.all (se den här diskussionen). Det fungerade bra tills nu, jag får ett fel när jag försöker använda ett Promise från MongoDB.

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

Enligt detta ärende på es6-promise (om jag har förstått det rätt), bryter den nya finally-egenskapen kompatibiliteten. Den finns på Promise som Mongo returnerar men inte på den jag importerade från es6-promise.

Någon idé?

Svar #1

Jag är den som noterade att finally-shimmet bröt Promise-kompatibiliteten i det länkade ärendet. Trevligt att se att detta får lite uppmärksamhet. Här är några alternativ:

1. Förlita dig enbart på TypeScript-kärnbibliotekets typdefinitioner

tsconfig.json

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

Installera shimmet, kör polyfillen en gång vid starten av din app, och använd därefter det globala Promise-objektet istället för att fortsätta importera Promise-klassen från es6-promise. Jag har funnit att detta är det mest interoperabla sättet.

npm install --save es6-promise@latest

Observera att es6-promise under de senaste versionerna har inkluderat sina egna typdefinitioner som krockar med typdefinitionerna i TypeScripts inbyggda Promise-bibliotek.

2. Använd en äldre version av es6-promise som inte inkluderar finally-shim

Observera: Detta betyder förstås att du inte kan använda finally

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

Installera den senaste versionen av es6-promise innan de införde finally, och använd de typdefinitionerna:

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

(Eller utelämna annars dessa typer och lägg till es2015.promise till din compilerOptions.lib-array i tsconfig.json.)

Svar #2

Om allt du behöver är en korrekt typdefinition för en Promise så kan du bara använda de inbyggda definitionerna som följer med TypeScript (jag säger detta eftersom du noterar att den promise du faktiskt arbetar med har finally-metoden som förväntat).

För att göra detta, ta bort es6-promise från ditt projekt och ändra i tsconfig din lib till:

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

Relaterade artiklar