2015-09-05 14 views
40

Ich lese this SO question aber Probleme mit dem Versprechen, mit Typoskript zu arbeiten. Hoffentlich können wir eine klare Anleitung geben. Dies ist für ein Server/Knoten-Projekt. Ich benutze tatsächlich die neuesten iojs, aber ziele auf ES5 als Ausgabe.Wie man ES6-Versprechen mit Typoskript benutzt?

$ tsd query es6-promise --action install --save 
$ npm install --save es6-promise 


// typescript code: 

/// <reference path="../../typings/es6-promise/es6-promise.d.ts"/> 

var Promise = require("es6-promise").Promise; 
require('es6-promise').polyfill(); 

function test():Promise { 
    var p:Promise = new Promise(); 
    return p; 
} 

dies gibt den Fehler:

Cannot find name 'Promise'. 

// alternativ:

var p = new Promise<string>((resolve, reject) => { 
    resolve('a string'); 
}); 


//error=> Untyped function calls may not accept type arguments. 

Was ist der empfohlene Weg, ein Versprechen von Ihrem eigenen Knoten Server-seitigen Code zurückzukehren?

Referenzen:

Antwort

45

main.ts

import {Promise} from 'es6-promise'; 
const p: Promise<string> = new Promise (
    (resolve: (str: string)=>void, reject: (str: string)=>void) => { 
     const a: string = "hello from Promise"; 
     resolve(a); 
    } 
); 
p.then((st) => { 
    console.log(st); 
}); 

tsconfig.json

{ 
    "compilerOptions": { 
     "target": "es3", 
     "module": "commonjs", 
     "declaration": false, 
     "noImplicitAny": false, 
     "noLib": false 
    }, 
    "filesGlob": [ 
     "./**/*.ts", 
     "!./node_modules/**/*.ts" 
    ], 
    "files": [ 
     "./main.ts", 
     "./typings/es6-promise/es6-promise.d.ts" 
    ] 
} 

compileandrun.sh

#!/bin/sh 
npm install es6-promise 
tsd install es6-promise 
tsc 
node main.js 
+0

tolle und detaillierte Antwort, vielen Dank! – dcsan

+2

Wird jetzt empfohlen, 'typings' anstelle von' tsd' zu verwenden? –

+5

Hinweis für diejenigen, die Angular 2 verwenden: Sie brauchen (und sollten nicht verwenden) die Import {Promise} -Anweisung, nicht benötigen Sie es6-promise.d.ts, da diese mit dem Angular 2-Framework (wie von Beta 15 sowieso). –

10

Folgendes wurde auf v2.1.1 + mit dem Ziel gesetzt es5

ich in der Lage war, durch die Installation von es6-promise Versprechungen async/await zu verwenden und dann das Hinzufügen dieser an den Anfang der Datei:

global.Promise = require('es6-promise').Promise; 

Und das zu tsconfig.json

"lib": [ "es2015.promise", "es5" ], 

die import { Promise } Formulars nicht für mich arbeiten, wie andere Bibliotheken wurden abstürzt (ex: axios)

1

Fügen Sie die folgenden package.json:

"devDependencies": { 
"@types/es6-promise": "^0.0.32" 
}, 
"dependencies": { 
"es6-promise": "~4.1.0" 
} 
+0

Wenn ich dies tue, muss ich 'Promise' importieren oder kann ich es einfach verwenden ? –

3

Ich brauchte diese für einen anderen Rahmen, um POLYfill (insbesondere axios); Ich musste meine eigenen Versprechen nicht wirklich erstellen, also hat keine dieser Lösungen für mich funktioniert.Zum Glück war die Antwort einfach, wenn gut versteckt:

import { polyfill } from 'es6-promise' 

polyfill(); 
+0

Super verspätete Antwort, aber ich wollte nur, dass Ihr persönlich mein Ansatz war. TS 2.7.2 mit keinem anderen Framework (z. B. kein Angular), das es6-Versprechen und dann "polyfill()" war der * einfachste Weg, IE11 zu unterstützen. Danke. – mschofield