Jak używać maszynopisu z natywnymi obietnicami ES6

121

Jestem kompletnym początkującym w Typescript i zastanawiam się, czy możliwe jest użycie obietnic ES6 w Typescript i co musiałbym zrobić, aby działały. Używam węzła 0.11.14 i podczas kompilacji pojawia się błąd „Nie można znaleźć nazwy„ Obietnica ””

dchang
źródło
1
Obietnic jeszcze nie ma w Node, potrzebujesz pakietu, wypróbujes6-promise
elclanrs

Odpowiedzi:

128

Obecny lib.d.ts nie ma zdefiniowanych obietnic, więc potrzebujesz do tego dodatkowego pliku definicji, dlatego otrzymujesz błędy kompilacji.

Możesz na przykład użyć (jak mówi @elclanrs) użyć pakietu es6-promise z plikiem definicji z DefinitelyTyped: definicja es6-promise

Następnie możesz go użyć w następujący sposób:

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

edytuj Możesz go używać bez definicji podczas kierowania na ES6 (za pomocą kompilatora TypeScript) - Pamiętaj, że nadal potrzebujesz, aby Promise istniała w czasie wykonywania (więc nie będzie działać w starych przeglądarkach :)) Dodaj / Edytuj następujące tsconfig.json:

"compilerOptions": {
    "target": "ES6"
}

edit 2 Kiedy pojawi się TypeScript 2.0, sytuacja trochę się zmieni (choć powyżej nadal działa), ale pliki definicji można zainstalować bezpośrednio za pomocą npm, jak poniżej:

npm install --save @types/es6-promise- źródło

edit3 Aktualizacja odpowiedzi o więcej informacji o używaniu typów.

Utwórz package.jsonplik tylko { }z zawartością (jeśli nie masz jeszcze pliku package.json. Wywołaj npm install --save @types/es6-promisei tsc --init. Pierwsze polecenie instalacji npm zmieni twoje, package.jsonaby uwzględnić es6-promise jako zależność. Tsc --init utworzy tsconfig.jsonplik dla Ciebie.

Możesz teraz użyć obietnicy w swoim pliku maszynopisu var x: Promise<any>;. Wykonaj, tsc -p .aby skompilować swój projekt. Nie powinieneś mieć żadnych błędów.

Dick van den Brink
źródło
5
wielkie dzięki Dick van den Brink! działa po zapytaniu tsd es6-promise --action install --save
dchang
3
zauważ, że Typescript v1.7.x definiuje plik definicji obietnicy es6 w C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb
2
Myślę, że mam ten sam problem, co @Kokodoko - mój plik package.json został zaktualizowany po pierwszej instrukcji, ale nie jest odbierany przez Intellisense (używam VS), transpiluje się i działa, więc wydaje się, że problem VS Intellisense ... Jakieś pomysły na ten temat? Próbowałem już przywrócić / zainstalować pakiety, ale nie zrobiłem różnicy.
rumblefx0
2
Dzień dobry. Myślę, że --save-devzamiast flagi należy użyć flagi --save, ponieważ biblioteka jest używana tylko w czasie kompilacji.
pan
2
To jest nieaktualne. Nie musisz ustawiać celu na ES6 ani instalować pliku typów. Zobacz moją odpowiedź poniżej.
paldepind
50

Alternatywa nr 1

Użyj opcji kompilatora targeti, libaby skompilować bezpośrednio do es5bez konieczności instalowania es6-shim. (Testowane za pomocą TypeScript 2.1.4). W sekcji lib użyj es2016lub es2015.promise.

// tsconfig.json
{
    "compilerOptions": {
        "target": "es5",
        "lib": [
            "es2015.promise",
            "dom"
        ]
    },
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}

Alternatywa nr 2

Użyj NPM, aby zainstalować organizację es6-shimz typów .

npm install @types/es6-shim --save-dev

Alternatywa nr 3

Przed TypeScript 2.0 użyj typów, aby zainstalować es6-shimglobalnie z DefinitelyTyped .

npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev

Ta typingsopcja używa npmdo instalacji typingsglobalnej, a następnie używa typingsdo zainstalowania podkładki. dt~Prefiks oznacza ściągnąć podkładkę z DefinitelyTyped. Ta --globalopcja oznacza, że ​​typy podkładek będą dostępne w całym projekcie.

Zobacz też

https://github.com/Microsoft/TypeScript/issues/7788 - Nie można znaleźć nazwy „Obietnica” i nie można znaleźć nazwy „Wymagaj”

Shaun Luttin
źródło
2
Włączanie es2016nie jest dobrym pomysłem, chyba że twój cel obsługuje ES2016. Jest wiele przeglądarek, które obsługują obietnice, ale nie wszystkie w ES2016. Służy es2015.promisedo włączania tylko typów obietnic bez pobierania typów dla wszystkiego w ES2016.
paldepind
23

Począwszy od TypeScript 2.0, możesz uwzględnić typy dla natywnych obietnic, dołączając następujące elementy do pliku tsconfig.json

"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}

Obejmuje to deklaracje obietnicy, które są dostarczane z TypeScript bez konieczności ustawiania celu na ES6.

paldepind
źródło
3
Myślę, że to najlepsza odpowiedź. Nie wymaga zmiany celu kompilacji ani wprowadzania wszystkich typów es2015.
Ethan
Jest to opcja, jeśli obsługujesz tylko nowe przeglądarki. Jeśli potrzebujesz obsługi IE10 lub starszych urządzeń z Androidem, nadal potrzebujesz polyfill.
Dick van den Brink,
13

Jeśli używasz node.js 0.12 lub nowszego / typescript 1.4 lub nowszego, po prostu dodaj opcje kompilatora, takie jak:

tsc a.ts --target es6 --module commonjs

Więcej informacji: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Jeśli używasz tsconfig.json, to w ten sposób:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6"
    }
}

Więcej informacji: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

Babka Yao
źródło
W rzeczywistości nie można używać razem commonjs i es6.
Adrian Ber,
3
@AdrianBer Właściwie możesz, wszystko się zmieniło. github.com/Microsoft/TypeScript/wiki/…
Babka Yao
to nie zadziała, jeśli planujesz wspierać IE. Po uruchomieniu w przeglądarce pojawi się „błąd składni”.
RoninCoder
12

To najnowszy sposób, aby to zrobić, powyższa odpowiedź jest nieaktualna:

typings install --global es6-promise

Nick Kenens
źródło
Typy istnieją już od jakiegoś czasu, ale TypeScript 2.0 pozwoli na instalowanie plików definicji bezpośrednio z npm (więc nie potrzebujesz dodatkowego narzędzia, takiego jak wpisywanie). Zaktualizowałem post o informację, kiedy TypeScript 2.0 będzie dostępny.
Dick van den Brink
3
Otrzymujemy następujący błąd: Próbowano skompilować „es6-promise” jako moduł globalny, ale wygląda na to, że jest to moduł zewnętrzny. Aby kontynuować, musisz usunąć opcję globalną.
Shaun Luttin,
teraz najnowszym sposobem jest: npm install @ type / es6-promise --save
Berty
To już nie jest najnowszy sposób. TypeScript jest dostarczany z typami dla obietnic po wyjęciu z pudełka. Nie ma potrzeby niczego instalować. Zobacz moją odpowiedź.
paldepind
5

Używanie natywnych obietnic ES6 z typescriptem w programie Visual Studio 2015 + narzędzia Node.js 1.2

Nie jest wymagana instalacja npm, ponieważ ES6 Promises jest natywna.

Projekt Node.js -> Właściwości -> karta Budowanie skryptu Typescript Wersja ECMAScript = ECMAScript6

import http = require('http');
import fs = require('fs');

function findFolderAsync(directory : string): Promise<string> {

    let p = new Promise<string>(function (resolve, reject) {

        fs.stat(directory, function (err, stats) {

            //Check if error defined and the error code is "not exists"
            if (err && err.code === "ENOENT") {
                reject("Directory does not exist");
            }
            else {
                resolve("Directory exists");
            }
        });

    });
    return p;
}

findFolderAsync("myFolder").then(

    function (msg : string) {
        console.log("Promise resolved as " + msg); 
    },
    function (msg : string) {
        console.log("Promise rejected as " + msg); 
    }
);
Bibek Bhattacharya
źródło
5

A. Jeśli używasz "target": "es5"i wersji TypeScript poniżej 2.0:

typings install es6-promise --save --global --source dt

B. Jeśli używasz "target": "es5"i TypeScript w wersji 2.0 lub nowszej:

"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}

C. Jeśli używasz "target": "es6", nie musisz nic robić.

Vaz
źródło
4
Używam "target": "es6"z TypeScript 2.1.1 i nadal otrzymuję Cannot find name 'Promise'.
zakdances 21.11.2016
-1

Musiałem obniżyć wersję @types/core-jsdo 9.36, aby działał z "target": "es5"zestawem w moim tsconfig.

"@types/core-js": "0.9.36",

James
źródło