我是打字稿的完全初学者,我想知道是否可以在打字稿中使用ES6承诺以及我必须做些什么才能让它们发挥作用。我正在运行节点0.11.14并且在编译过程中遇到错误"找不到姓名'承诺'"
答案 0 :(得分:121)
当前的lib.d.ts中没有定义的promise,所以你需要一个额外的定义文件,这就是你得到编译错误的原因。
您可以使用(例如@elclanrs说)将es6-promise包与DefinitelyTyped的定义文件一起使用:es6-promise definition
然后您可以像这样使用它:
var p = new Promise<string>((resolve, reject) => {
resolve('a string');
});
编辑在定位ES6时(使用TypeScript编译器),您可以在没有定义的情况下使用它 - 请注意,您仍然需要在运行时期间存在Promise(因此它在旧浏览器中不起作用) :))
在tsconfig.json
添加/编辑以下内容:
"compilerOptions": {
"target": "ES6"
}
编辑2 当TypeScript 2.0出现时,事情会发生一些变化(尽管上面仍然有效),但定义文件可以直接用npm安装,如下所示:
npm install --save @types/es6-promise
- source
<强> EDIT3 强> 使用更多信息更新答案以使用类型。
创建仅package.json
作为内容的{ }
文件(如果您还没有package.json)。
致电npm install --save @types/es6-promise
和tsc --init
。第一个npm install命令将更改您的package.json
以包含es6-promise作为依赖项。 tsc --init将为您创建一个tsconfig.json
文件。
您现在可以在打字稿文件var x: Promise<any>;
中使用promise。
执行tsc -p .
以编译您的项目。你应该没有错误。
答案 1 :(得分:47)
使用target
和lib
编译器选项直接编译为es5
,而无需安装es6-shim
。 (使用TypeScript 2.1.4
测试)。
在lib部分中,使用es2016
或es2015.promise
。
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"es2015.promise",
"dom"
]
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
Use NPM to install来自types organization的es6-shim
。
npm install @types/es6-shim --save-dev
在TypeScript 2.0之前,使用typings从DefinitelyTyped全局安装es6-shim
。
npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
typings
选项使用npm
全局安装typings
,然后使用typings
安装填充程序。 dt~
前缀表示从DefinitelyTyped下载填充程序。 --global
选项意味着垫片的类型将在整个项目中可用。
https://github.com/Microsoft/TypeScript/issues/7788 - 找不到名字'承诺'&amp;找不到名称'require'
答案 2 :(得分:23)
从TypeScript 2.0开始,您可以在tsconfig.json
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
这将包括TypeScript附带的promise声明,而不必将目标设置为ES6。
答案 3 :(得分:13)
如果您使用node.js 0.12或更高版本/ typescript 1.4或更高版本,只需添加编译器选项,如:
tsc a.ts --target es6 --module commonjs
更多信息:https://github.com/Microsoft/TypeScript/wiki/Compiler-Options
如果你使用tsconfig.json
,那么就像这样:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
}
}
更多信息:https://github.com/Microsoft/TypeScript/wiki/tsconfig.json
答案 4 :(得分:12)
这是最近这样做的方法,上面的答案已经过时了:
typings install --global es6-promise
答案 5 :(得分:6)
一个。如果使用"target": "es5"
和TypeScript版本低于2.0:
typings install es6-promise --save --global --source dt
B中。如果使用"target": "es5"
和TypeScript版本2.0或更高版本:
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
℃。如果使用"target": "es6"
,则无需执行任何操作。
答案 6 :(得分:5)
不需要安装npm,因为ES6 Promises是原生的。
Node.js项目 - &gt;属性 - &gt; Typescript构建选项卡 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);
}
);
答案 7 :(得分:-1)
我不得不将@types/core-js
降级到9.36,以使其与我的tsconfig中设置的"target": "es5"
一起使用。
"@types/core-js": "0.9.36",
答案 8 :(得分:-1)
字体问题 在 tsconfig.json 中,添加以下属性:"strictPropertyInitialization": false