Kräver ES6 Promise argument i TypeScript 2.0?


Jag fortsätter arbetet på ett befintligt TypeScript-projekt. Det ursprungliga projektet använde gulp-typescript för att kompilera .ts-filerna, men jag använder tsc-kompilatorn som följer med Visual Studio Code. Men jag kan inte få ES6-promises att fungera.

Jag har installerat en definitionsfil för ES6-löften:

npm install --save @types/es6-promise

Detta skapar en katalog inne i node_modules-mappen som har definitionsfilen för promise:

node_modules
    @types
        es6-promise
            index.d.ts
            package.json
            types-metadata.json
            readme.md

tsconfig.json

"files": [
    "src/main.ts",
    "src/game.ts",
    "node_modules/@types/es6-promise/index.d.ts"
]

referens

///<reference path="../node_modules/@types/es6-promise/index.d.ts" />

Jag antar att inkluderingen av definitionsfilen för löftet nu fungerar, men jag får följande fel när jag kompilerar projektet:

error TS2314: Generic type 'Promise<T>' requires 1 type argument(s).

När jag tittar i den ursprungliga koden hittar jag detta:

    private componentsPromise: Promise<Component[]>;
    private startPromise: Promise; // <- error

    public getComponents(): Promise<Component[]> {
        return this.componentsPromise;
    }

    public isStarted(): Promise {   // <-- error
        return this.startPromise;
    }

Är detta ett enkelt fel i det ursprungliga projektet eller missar jag något? Vad behöver jag lägga till här för att få löften att fungera igen?

Svar #1

Ett löfte är generiskt eftersom det varierar beroende på dess interna värde. Så om du har ett löfte och du anropar .then(x => ...), vilken typ har x? Den generiska typen låter typkontrollen tolka detta korrekt.

För att få detta att fungera behöver du lägga till den specifika typen. Om den inte innehåller någon data och används enbart för resolve/reject-funktionen, använd Promise<void>. I slutändan är detta en typdefinition precis som vilken annan, så du kan använda Promise<any> om du behöver.

Relaterade artiklar