javascript - TypeScript Promise TS2304 TS2529
Jeg hadde følgende kode:
function asyncFunc1(): Promise<string> {
return new Promise<string>(x => x);
}
som ga følgende feil:
TS2304: kan ikke finne navnet 'Promise'
Så jeg endret det for å eksplisitt erklære 'Promise':
///<reference path="../typings/modules/bluebird/index.d.ts" />
import * as Promise from 'bluebird';
function asyncFunc1(): Promise<string> {
return new Promise<string>(x => x);
}
og nå får jeg følgende feil:
TS2529: Dobbelt identifikator 'Promise'. Kompilatoren reserverer navnet 'Promise' i toppnivåområdet til en modul som inneholder asynkrone funksjoner
Hvordan kan jeg løse dette paradokset?
Svar #1
Løfter er bare tilgjengelige i ES6
Hvis du setter målet til ES6, bruker TypeScript-kompilatoren et annet basisbibliotek for grunnleggende typekontroll mot typer inkludert i språkspesifikasjonen. Sørg for at du målretter mot ES6.
Løfter i TypeScript uten å sikte på ES6
Hvis du vil ha tilgang til definisjonen av Constructors som metoder definert i es2015-spesifikasjonen, som har blitt implementert av nettlesere og NodeJS (via V8-motoren) før språkfunksjoner - som pilfunksjoner, destrukturering, etc - kan du gjøre det.
Det du vil gjøre er å konfigurere TypeScript til å sikte mot es5, ikke inkludere standardbiblioteket, og referere til standardbiblioteket selv.
Din tsconfig kan se noe slik ut:
{
"compilerOptions: {
"noLib": true,
"target": "ES5",
}
"files": [
"node_modules/typescript/lib/lib.es6.d.ts",
"app.ts",
]
}
Eksemplene ovenfor antar at TypeScript er installert direkte i prosjektet ditt. Hvis det ikke er det, kan du alltid kopiere fra TypeScript-installasjonsmappen og inkludere det i prosjektet ditt.
Denne løsningen bør gi deg typings for Promise-konstruktøren, samt en rekke andre funksjoner som array.includes() og noen andre ting. Dette har ulempen at du ikke får typefeil for ting som ikke er implementert i nettleserne, men hvis du uansett bruker Promise, retter du sannsynligvis mot moderne nettlesere, eller du bruker Node hvor du kontrollerer kjøremiljøet.
Svar #2
Det ser ut til at TypeScript beskytter Promise-identifikatoren. Prøv å importere under et annet navn enn Promise, eller bruk et annet sett med typings. Det finnes noen forslag i denne TypeScript GitHub-saken.
Async/await med Bluebird-løfter
Problemet gjelder bruk av et annet promise-bibliotek med Async Await, men denne situasjonen er sannsynligvis grunnen til at de beskytter Promise-navnet. Spesifikt, når vi bruker Async/Await i TypeScript, konverterer kompilatoren dette til en Promise i den utgitte koden, så kompilatoren prøver å beskytte Promise-konstruktøren fra å bli overskrevet. Du kan alltid lure kompilatoren med denne typen ting, men sørg for å spørre deg selv om det er riktig å gjøre det.
