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.

Relaterte artikler