Cách sử dụng Typecript với Lời hứa ES6 bản địa


121

Tôi là một người mới bắt đầu hoàn chỉnh về Typecript và đang tự hỏi liệu có thể sử dụng các hứa hẹn của ES6 trong Typescript hay không và tôi sẽ phải làm gì để chúng hoạt động. Tôi đang chạy nút 0.11.14 và gặp lỗi trong quá trình biên dịch "Không thể tìm thấy tên 'Promise'"


1
Lời hứa không phải là trong Node nào, bạn cần một gói, thửes6-promise
elclanrs

Câu trả lời:


128

Lib.d.ts hiện tại không có các hứa hẹn trong nó được định nghĩa, vì vậy bạn cần một tệp định nghĩa bổ sung cho nó, đó là lý do tại sao bạn gặp lỗi biên dịch.

Ví dụ, bạn có thể sử dụng (như @elclanrs nói) sử dụng gói es6-hứa với tệp định nghĩa từ Định nghĩa chắc chắnTyped : es6-Hứa

Sau đó, bạn có thể sử dụng nó như thế này:

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

chỉnh sửa Bạn có thể sử dụng nó mà không cần định nghĩa khi nhắm mục tiêu ES6 (với trình biên dịch TypeScript) - Lưu ý rằng bạn vẫn yêu cầu Lời hứa tồn tại trong thời gian chạy tất nhiên (vì vậy nó sẽ không hoạt động trong các trình duyệt cũ :)) Thêm / Chỉnh sửa phần sau vào tsconfig.json:

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

chỉnh sửa 2 Khi TypeScript 2.0 ra mắt, mọi thứ sẽ thay đổi một chút (mặc dù ở trên vẫn hoạt động) nhưng các tệp định nghĩa có thể được cài đặt trực tiếp với npm như bên dưới:

npm install --save @types/es6-promise- nguồn

3 Cập nhật câu trả lời với nhiều thông tin hơn để sử dụng các loại.

Tạo package.jsontệp chỉ { }với nội dung (nếu bạn chưa có package.json. Gọi npm install --save @types/es6-promisetsc --init. Lệnh npm install đầu tiên sẽ thay đổi việc bạn package.jsonbao gồm es6-promise như một phần phụ thuộc. Tsc --init sẽ tạo một tsconfig.jsontệp cho bạn.

Bây giờ bạn có thể sử dụng lời hứa trong tệp bảng chữ của mình var x: Promise<any>;. Thực thi tsc -p .để biên dịch dự án của bạn. Bạn không nên có lỗi.


5
cảm ơn rất nhiều Dick van den Brink! và chạy sau một TSD truy vấn es6-lời hứa --trò cài đặt --save
dchang

3
lưu ý rằng Typescript v1.7.x định nghĩa tệp định nghĩa lời hứa es6 tại C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb

2
Tôi nghĩ rằng tôi gặp vấn đề tương tự như @Kokodoko - package.json của tôi đã được cập nhật sau câu lệnh đầu tiên, nhưng nó không được Intellisense chọn (tôi đang sử dụng VS), nó chuyển vị và chạy mặc dù có vẻ như là vấn đề VS Intellisense ... Bất kỳ ý tưởng về điều này? Tôi đã thử khôi phục / cài đặt các gói nhưng không tạo ra sự khác biệt.
rumblefx0

2
Xin chào. Tôi nghĩ rằng cờ --save-devnên được sử dụng thay vì --savethư viện chỉ được sử dụng tại thời điểm biên dịch.
mrr,

2
Điều này đã lỗi thời. Bạn không phải đặt mục tiêu thành ES6 cũng như không phải cài đặt tệp đánh máy. Xem câu trả lời của tôi dưới đây.
paldepind

50

Phương án số 1

Sử dụng các tùy chọn targetlibtrình biên dịch để biên dịch trực tiếp es5mà không cần cài đặt es6-shim. (Đã thử nghiệm với TypeScript 2.1.4). Trong phần lib, sử dụng es2016hoặc es2015.promise.

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

Phương án số 2

Sử dụng NPM để cài đặt các es6-shimtừ tổ chức các loại .

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

Phương án số 3

Trước khi đánh máy 2.0, sử dụng typings để cài đặt es6-shimtrên toàn cầu từ DefinitelyTyped .

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

Các typingstùy chọn sử dụng npmđể cài đặt typingstrên toàn thế giới và sau đó sử dụng typingsđể cài đặt shim. Các dt~tiền tố có nghĩa là để tải về shim từ DefinitelyTyped. Các --globalphương tiện lựa chọn rằng các loại của shim sẽ có sẵn trong suốt dự án.

Xem thêm

https://github.com/Microsoft/TypeScript/issues/7788 - Không thể tìm thấy tên 'Promise' & Không thể tìm thấy tên 'request'


2
Bao gồm es2016không phải là một ý tưởng hay trừ khi mục tiêu của bạn hỗ trợ ES2016. Có rất nhiều trình duyệt hỗ trợ hứa hẹn nhưng không phải tất cả mọi thứ trong ES2016. Sử dụng es2015.promiseđể chỉ bao gồm các loại cho lời hứa mà không kéo các loại cho mọi thứ trong ES2016.
paldepind

23

Kể từ TypeScript 2.0, bạn có thể bao gồm các cách đánh máy cho các hứa hẹn gốc bằng cách bao gồm những điều sau đây trong tsconfig.json

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

Điều này sẽ bao gồm các khai báo hứa đi kèm với TypeScript mà không cần phải đặt mục tiêu thành ES6.


3
Đây là câu trả lời tốt nhất, tôi nghĩ. Nó không yêu cầu thay đổi mục tiêu biên dịch của bạn hoặc đưa vào tất cả các kiểu đánh máy es2015.
Ethan

Đây là một tùy chọn khi bạn chỉ hỗ trợ các trình duyệt mới. Nếu bạn yêu cầu hỗ trợ IE10 hoặc các thiết bị Android cũ hơn, bạn vẫn cần một polyfill.
Dick van den Brink

13

Nếu bạn sử dụng node.js 0.12 trở lên / stylescript 1.4 trở lên, chỉ cần thêm các tùy chọn trình biên dịch như:

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

Thông tin thêm: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Nếu bạn sử dụng tsconfig.json, thì như thế này:

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

Thông tin thêm: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json


Bạn thực sự không thể sử dụng commonjs và es6 cùng nhau.
Adrian Ber

3
@AdrianBer Trên thực tế, bạn có thể, mọi thứ đã thay đổi. github.com/Microsoft/TypeScript/wiki/…
Plantain Yao

điều này sẽ không hoạt động nếu bạn định hỗ trợ IE. Bạn sẽ gặp 'lỗi cú pháp' trong trình duyệt khi chạy nó.
RoninCoder

12

Đây là cách gần đây nhất để làm điều này, câu trả lời ở trên đã lỗi thời:

typings install --global es6-promise


Kiểu chữ đã tồn tại khá lâu nhưng TypeScript 2.0 sẽ cho phép cài đặt các tệp định nghĩa trực tiếp từ npm (vì vậy bạn không cần một công cụ bổ sung như kiểu chữ). Đã cập nhật bài đăng của tôi với thông tin khi TypeScript 2.0 sẽ có sẵn.
Dick van den Brink

3
Chúng tôi nhận được lỗi sau: Đã cố biên dịch "es6-promise" dưới dạng mô-đun chung, nhưng nó trông giống như một mô-đun bên ngoài. Bạn sẽ cần phải xóa tùy chọn chung để tiếp tục.
Shaun Luttin

bây giờ cách gần đây nhất là: NPM cài đặt @ loại / es6-hứa --save
Berty

Đây không còn là cách gần đây nhất. TypeScript cung cấp các loại cho Promise ra khỏi hộp. Không cần phải cài đặt bất cứ thứ gì. Hãy xem câu trả lời của tôi.
paldepind

5

Sử dụng lời hứa ES6 bản địa với Typescript trong Visual Studio 2015 + công cụ Node.js 1.2

Không cần cài đặt npm vì ES6 Promises là bản gốc.

Dự án Node.js -> Thuộc tính -> Tab Định dạng Bản dựng Phiên bản 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); 
    }
);

5

A. Nếu sử dụng "target": "es5"và phiên bản TypeScript dưới 2.0:

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

B. Nếu sử dụng "target": "es5"và TypeScript phiên bản 2.0 hoặc cao hơn:

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

C. Nếu sử dụng "target": "es6"thì không cần làm gì cả.


4
Tôi đang sử dụng "target": "es6"với TypeScript 2.1.1 và tôi vẫn nhận được Cannot find name 'Promise'.
zakdances

-1

Tôi đã phải hạ cấp xuống @types/core-js9.36 để nó hoạt động với "target": "es5"thiết lập trong tsconfig của tôi.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.