Typescript yerel ES6 Promises ile nasıl kullanılır


121

Typescript'e tamamen yeni başlayan biriyim ve Typescript'te ES6 vaatlerini kullanmanın mümkün olup olmadığını ve bunların çalışması için ne yapmam gerektiğini merak ediyorum. 0.11.14 düğümünü çalıştırıyorum ve derleme sırasında bir hata alıyorum "'Promise' adı bulunamıyor"


1
Sözler henüz es6-promise
Düğümde değil

Yanıtlar:


128

Şu anki lib.d.ts'de tanımlanmış vaatler yok, bu yüzden onun için fazladan bir tanım dosyasına ihtiyacınız var, bu yüzden derleme hataları alıyorsunuz.

Örneğin (@elclanrs'ın söylediği gibi), DefinitelyTyped'deki tanım dosyasıyla es6-promise paketini kullanabilirsiniz: es6-promise tanımı

Daha sonra bunu şu şekilde kullanabilirsiniz:

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

düzenleme ES6'yı hedeflerken bir tanım olmadan kullanabilirsiniz (TypeScript derleyicisiyle) - Promise'in dersin çalışma zamanında var olmasını gerektirdiğini unutmayın (bu nedenle eski tarayıcılarda çalışmaz :)) Aşağıdakileri ekleyin / düzenleyin: tsconfig.json:

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

edit 2 TypeScript 2.0 çıktığında işler biraz değişecek (yine de yukarıda çalışıyor) ancak tanım dosyaları aşağıdaki gibi doğrudan npm ile kurulabilir:

npm install --save @types/es6-promise- kaynak

edit3 Türleri kullanmak için daha fazla bilgi ile yanıtı güncelleme.

package.jsonYalnızca { }içeriği olan bir dosya oluşturun (zaten bir package.json'a sahip değilseniz. Çağrı npm install --save @types/es6-promiseve tsc --init. İlk npm install komutu, package.jsonbağımlılık olarak es6-promise'ı içerecek şekilde değiştirecektir . Tsc --init bir tsconfig.jsondosya oluşturacaktır senin için.

Artık typecript dosyanızdaki sözü kullanabilirsiniz var x: Promise<any>;. tsc -p .Projenizi derlemek için yürütün . Hiç hata yapmamalısın.


5
çok teşekkürler Dick van den Brink! bir tsd sorgusundan sonra çalışıyor ve çalışıyor es6-promise --action install --save
dchang

3
Typescript v1.7.x'in es6 promise tanım dosyasını C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb

2
Sanırım @Kokodoko ile aynı sorunu yaşıyorum - paketim.json ilk ifadeden sonra güncellendi, ancak Intellisense tarafından alınmıyor (VS kullanıyorum), aktarılıyor ve çalışıyor olsa da VS Intellisense sorunu gibi görünüyor ... Bununla ilgili bir fikriniz var mı? Zaten paketleri geri yüklemeyi / yüklemeyi denedim, ancak bir fark yaratmadım.
rumblefx0

2
Merhaba. Kitaplık yalnızca derleme sırasında kullanıldığından bayrağın --save-devyerine kullanılması gerektiğini düşünüyorum --save.
mrr

2
Bu modası geçmiş. Hedefi ES6'ya ayarlamanız veya bir yazım dosyası yüklemeniz gerekmez. Aşağıdaki cevabıma bakın.
paldepind

50

Alternatif # 1

.Dll dosyasını kurmanıza gerek kalmadan doğrudan derlemek için targetve libderleyici seçeneklerini kullanın . (TypeScript ile test edilmiştir ). Kitaplık bölümünde, veya kullanın .es5es6-shim2.1.4es2016es2015.promise

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

Alternatif # 2

Yüklemek için UÖM'yi kullanınes6-shim gelen tipleri organizasyon .

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

Alternatif # 3

TypeScript 2.0'dan önce , DefinitelyTyped'den global olarak yüklemek için yazımları kullanın .es6-shim

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

typingsSeçeneği kullanır npmyüklemek typingsküresel ve sonra kullandığı typingsşim kurmak için. dt~Önek DefinitelyTyped şimi indirmek anlamına gelir. --globalOpsiyon aracı Shim en türleri proje boyunca kullanılabilir olacağını.

Ayrıca bakınız

https://github.com/Microsoft/TypeScript/issues/7788 - 'Söz' adı bulunamıyor ve 'gerekli' adı bulunamıyor


2
es2016Hedefiniz ES2016'yı desteklemediği sürece dahil etmek iyi bir fikir değildir. ES2016'da vaatleri destekleyen ancak her şeyi desteklemeyen birçok tarayıcı var. Kullanım es2015.promiseES2016 her şey için türlerinde çekerek olmadan vaatler için sadece türlerini içerecek şekilde.
paldepind

23

TypeScript 2.0'dan itibaren, yerel vaatler için yazımları, aşağıdakileri tsconfig.json

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

Bu, hedefi ES6 olarak ayarlamak zorunda kalmadan TypeScript ile birlikte gelen vaat bildirimlerini içerecektir.


3
Bence en iyi cevap bu. Derleme hedefinizi değiştirmenizi veya tüm es2015 türlerini getirmenizi gerektirmez.
Ethan

Bu, yalnızca yeni tarayıcıları desteklediğinizde bir seçenektir. IE10 veya daha eski android cihaz desteğine ihtiyacınız varsa, yine de bir polyfill'e ihtiyacınız vardır.
Dick van den Brink

13

Node.js 0.12 veya üstünü / typescript 1.4 veya üstünü kullanıyorsanız, aşağıdaki gibi derleyici seçenekleri eklemeniz yeterlidir:

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

Daha fazla bilgi: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Eğer kullanırsan tsconfig.json, şunu beğen:

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

Daha fazla bilgi: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json


Aslında commonjs ve es6'yı birlikte kullanamazsınız.
Adrian Ber

3
@AdrianBer Aslında yapabilirsin, işler değişti. github.com/Microsoft/TypeScript/wiki/…
Plantain Yao

IE'yi desteklemeyi planlıyorsanız bu işe yaramayacaktır. Çalıştırırken tarayıcıda 'sözdizimi hatası' alacaksınız.
RoninCoder

12

Bunu yapmanın en son yolu, yukarıdaki cevabın süresi doldu:

typings install --global es6-promise


Yazılar bir süredir zaten var, ancak TypeScript 2.0, tanım dosyalarını doğrudan npm'den yüklemeye izin verecek (bu nedenle yazım gibi ek bir araca ihtiyacınız yok). Yazım, TypeScript 2.0 kullanılabilir olduğunda bilgilerle güncellendi.
Dick van den Brink

3
Şu hatayı alıyoruz: "es6-promise" genel bir modül olarak derlenmeye çalışıldı, ancak harici bir modül gibi görünüyor. Devam etmek için genel seçeneği kaldırmanız gerekecek.
Shaun Luttin

şimdi en son yoludur: tip @ yüklemek npm / --save ES6-söz
Berty

Bu artık en yeni yol değil. TypeScript, kutudan çıkar çıkmaz Promises türleri ile birlikte gelir. Hiçbir şey yüklemenize gerek yoktur. Cevabımı gör.
paldepind

5

Visual Studio 2015 + Node.js araçları 1.2'de Typescript ile yerel ES6 Promises kullanma

ES6 Promises yerel olduğundan npm yüklemesi gerekmez.

Node.js projesi -> Özellikler -> Typescript Oluşturma sekmesi ECMAScript sürümü = 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); 
    }
);

5

A. "target": "es5"TypeScript sürümü 2.0'ın altında kullanılıyorsa :

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

B. "target": "es5"TypeScript 2.0 veya higer kullanılıyorsa:

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

C. Kullanıyorsanız "target": "es6", hiçbir şey yapmaya gerek yoktur.


4
"target": "es6"TypeScript 2.1.1 ile kullanıyorum ve hala alıyorum Cannot find name 'Promise'.
zakdances

-1

Eski sürüme zorunda @types/core-jsolan işe almak için 9.36 için "target": "es5"benim tsconfig sete.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.