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.