Cara menggunakan Typecript dengan janji ES6 asli

121

Saya benar-benar pemula dalam Ketikan dan bertanya-tanya apakah mungkin menggunakan janji ES6 di Ketikan dan apa yang harus saya lakukan untuk membuatnya berfungsi. Saya menjalankan node 0.11.14 dan mendapatkan error selama kompilasi "Tidak dapat menemukan nama 'Janji'"

dchang
sumber
1
Janji belum ada di Node, Anda perlu sebuah paket, cobaes6-promise
elclanrs

Jawaban:

128

Lib.d.ts saat ini tidak memiliki promise di dalamnya sehingga Anda memerlukan file definisi tambahan untuk itu, itulah sebabnya Anda mendapatkan kesalahan kompilasi.

Anda bisa misalnya menggunakan (seperti @elclanrs mengatakan) menggunakan paket es6-promise dengan file definisi dari DefinitelyTyped: es6-promise definition

Anda kemudian dapat menggunakannya seperti ini:

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

edit Anda dapat menggunakannya tanpa definisi saat menargetkan ES6 (dengan compiler TypeScript) - Perhatikan bahwa Anda masih memerlukan Promise untuk ada di runtime ofcourse (sehingga tidak akan berfungsi di browser lama :)) Tambahkan / Edit berikut ini ke tsconfig.json:

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

edit 2 Ketika TypeScript 2.0 akan keluar, hal-hal akan berubah sedikit (meskipun di atas masih berfungsi) tetapi file definisi dapat diinstal langsung dengan npm seperti di bawah ini:

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

edit3 Memperbarui jawaban dengan lebih banyak info untuk menggunakan tipe.

Buat package.jsonfile dengan hanya { }sebagai isinya (jika Anda belum memiliki package.json. Panggil npm install --save @types/es6-promisedan tsc --init. Perintah npm install pertama akan mengubah Anda package.jsonuntuk menyertakan es6-promise sebagai dependensi. Tsc --init akan membuat tsconfig.jsonfile untukmu.

Sekarang Anda dapat menggunakan promise dalam file skrip Anda var x: Promise<any>;. Jalankan tsc -p .untuk mengompilasi proyek Anda. Anda seharusnya tidak memiliki kesalahan.

Dick van den Brink
sumber
5
banyak terima kasih Dick van den Brink! aktif dan berjalan setelah permintaan tsd es6-promise --action install
--save
3
Perhatikan bahwa Typecript v1.7.x mendefinisikan file definisi janji es6 di C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb
2
Saya pikir saya memiliki masalah yang sama dengan @Kokodoko - package.json saya diperbarui setelah pernyataan pertama, tetapi tidak diambil oleh Intellisense (saya menggunakan VS), itu transparan dan berjalan meskipun sepertinya masalah VS Intellisense ... Ada ide tentang ini? Saya sudah mencoba memulihkan / menginstal paket, tetapi tidak membuat perbedaan.
rumblefx0
2
Halo. Saya pikir bendera --save-devharus digunakan sebagai pengganti --save, karena perpustakaan hanya digunakan pada waktu kompilasi.
Tuan
2
Ini sudah ketinggalan zaman. Anda tidak perlu menetapkan target ke ES6 atau menginstal file pengetikan. Lihat jawaban saya di bawah.
paldepind
50

Alternatif # 1

Gunakan opsi targetdan libkompiler untuk mengkompilasi langsung ke es5tanpa perlu menginstal es6-shim. (Diuji dengan TypeScript 2.1.4). Di bagian lib, gunakan salah satu es2016atau es2015.promise.

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

Alternatif # 2

Gunakan NPM untuk menginstal yang es6-shimdari organisasi jenis .

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

Alternatif # 3

Sebelum TypeScript 2.0, gunakan pengetikan untuk menginstal es6-shimsecara global dari DefinitelyTyped .

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

The typingspilihan menggunakan npmuntuk menginstal typingssecara global dan kemudian menggunakan typingsuntuk menginstal shim. The dt~awalan berarti untuk men-download shim dari DefinitelyTyped. The --globalberarti pilihan itu jenis shim akan tersedia di seluruh proyek.

Lihat juga

https://github.com/Microsoft/TypeScript/issues/7788 - Tidak dapat menemukan nama 'Promise' & Tidak dapat menemukan nama 'memerlukan'

Shaun Luttin
sumber
2
Menyertakan es2016bukanlah ide yang baik kecuali target Anda mendukung ES2016. Ada banyak browser yang mendukung promise tetapi tidak semuanya di ES2016. Gunakan es2015.promiseuntuk menyertakan hanya tipe untuk promise tanpa menarik jenis untuk semuanya di ES2016.
paldepind
23

Mulai TypeScript 2.0 Anda dapat memasukkan pengetikan untuk janji asli dengan menyertakan yang berikut ini di file tsconfig.json

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

Ini akan mencakup deklarasi janji yang disertakan dengan TypeScript tanpa harus menyetel target ke ES6.

paldepind
sumber
3
Ini adalah jawaban terbaik, menurut saya. Tidak perlu mengubah target kompilasi Anda atau memasukkan semua pengetikan es2015.
Ethan
Ini adalah opsi jika Anda hanya mendukung browser baru. Jika Anda memerlukan dukungan IE10 atau perangkat android yang lebih lama, Anda masih memerlukan polyfill.
Dick van den Brink
13

Jika Anda menggunakan node.js 0.12 atau lebih tinggi / typescript 1.4 atau lebih tinggi, cukup tambahkan opsi compiler seperti:

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

Info selengkapnya: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Jika Anda menggunakan tsconfig.json, maka seperti ini:

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

Info selengkapnya: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

Pisang raja Yao
sumber
Anda tidak bisa menggunakan commonjs dan es6 secara bersamaan.
Adrian Ber
3
@AdrianBer Sebenarnya Anda bisa, banyak hal berubah. github.com/Microsoft/TypeScript/wiki/…
Plantain Yao
ini tidak akan berhasil jika Anda berencana untuk mendukung IE. Anda akan mendapatkan 'kesalahan sintaks' di browser saat menjalankannya.
RoninCoder
12

Ini cara terbaru untuk melakukan ini, jawaban di atas sudah usang:

typings install --global es6-promise

Nick Kenens
sumber
Pengetikan sudah ada untuk beberapa waktu sekarang tetapi TypeScript 2.0 akan memungkinkan penginstalan file definisi langsung dari npm (jadi Anda tidak memerlukan alat tambahan seperti pengetikan). Memperbarui posting saya dengan informasi kapan TypeScript 2.0 akan tersedia.
Dick van den Brink
3
Kami menerima kesalahan berikut: Mencoba mengompilasi "es6-promise" sebagai modul global, tetapi sepertinya modul eksternal. Anda harus menghapus opsi global untuk melanjutkan.
Shaun Luttin
sekarang cara terbaru adalah: npm install @ type / es6-promise --save
Berty
Ini bukan lagi cara terbaru. TypeScript dikirimkan dengan tipe untuk Janji di luar kotak. Tidak perlu menginstal apapun. Lihat jawaban saya.
paldepind
5

Menggunakan asli janji ES6 dengan skrip di Visual Studio 2015 + alat Node.js 1.2

Tidak diperlukan instalasi npm karena ES6 Promises adalah native.

Proyek Node.js -> Properti -> Tab Bangun Typecript Versi 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
sumber
5

"target": "es5"A.Jika menggunakan dan TypeScript versi di bawah 2.0:

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

"target": "es5"B.Jika menggunakan dan TypeScript versi 2.0 atau lebih tinggi:

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

C. Jika menggunakan "target": "es6", tidak perlu melakukan apa pun.

Vaz
sumber
4
Saya menggunakan "target": "es6"dengan TypeScript 2.1.1 dan saya masih mendapatkannya Cannot find name 'Promise'.
zakdance
-1

Saya harus menurunkan versi @types/core-jske 9.36 untuk membuatnya berfungsi dengan "target": "es5"set di tsconfig saya.

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

James
sumber