Câu trả lời:
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.json
tệp chỉ { }
với nội dung (nếu bạn chưa có package.json. Gọi npm install --save @types/es6-promise
và tsc --init
. Lệnh npm install đầu tiên sẽ thay đổi việc bạn package.json
bao gồm es6-promise như một phần phụ thuộc. Tsc --init sẽ tạo một tsconfig.json
tệ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.
--save-dev
nên được sử dụng thay vì --save
thư viện chỉ được sử dụng tại thời điểm biên dịch.
Sử dụng các tùy chọn target
và lib
trình biên dịch để biên dịch trực tiếp es5
mà 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 es2016
hoặc es2015.promise
.
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"es2015.promise",
"dom"
]
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
Sử dụng NPM để cài đặt các es6-shim
từ tổ chức các loại .
npm install @types/es6-shim --save-dev
Trước khi đánh máy 2.0, sử dụng typings để cài đặt es6-shim
trên toàn cầu từ DefinitelyTyped .
npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
Các typings
tùy chọn sử dụng npm
để cài đặt typings
trê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 --global
phươ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.
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'
es2016
khô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.
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.
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
Đâ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
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);
}
);
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ả.
"target": "es6"
với TypeScript 2.1.1 và tôi vẫn nhận được Cannot find name 'Promise'
.
es6-promise