I'm a complete beginner to Typescript and am wondering if it's possible to use ES6 promises in Typescript and what I would have to do to get them to work. I'm running node 0.11.14 and am getting an error during compilation "Cannot find name 'Promise'"
-
1Promises are not in Node yet, you need a package, try `es6-promise` – elclanrs Dec 19 '14 at 20:28
9 Answers
The current lib.d.ts doesn't have promises in it defined so you need a extra definition file for it that is why you are getting compilation errors.
You could for example use (like @elclanrs says) use the es6-promise package with the definition file from DefinitelyTyped: es6-promise definition
You can then use it like this:
var p = new Promise<string>((resolve, reject) => {
resolve('a string');
});
edit You can use it without a definition when targeting ES6 (with the TypeScript compiler) - Note you still require the Promise to exists in the runtime ofcourse (so it won't work in old browsers :))
Add/Edit the following to your tsconfig.json
:
"compilerOptions": {
"target": "ES6"
}
edit 2 When TypeScript 2.0 will come out things will change a bit (though above still works) but definition files can be installed directly with npm like below:
npm install --save @types/es6-promise
- source
edit3 Updating answer with more info for using the types.
Create a package.json
file with only { }
as the content (if you don't have a package.json already.
Call npm install --save @types/es6-promise
and tsc --init
. The first npm install command will change your package.json
to include the es6-promise as a dependency. tsc --init will create a tsconfig.json
file for you.
You can now use the promise in your typescript file var x: Promise<any>;
.
Execute tsc -p .
to compile your project. You should have no errors.

- 32,300
- 7
- 79
- 115

- 13,690
- 3
- 32
- 43
-
5many thanks Dick van den Brink! up and running after a tsd query es6-promise --action install --save – dchang Dec 19 '14 at 21:22
-
I've use your code in angular2 and there is an error: async_1.Promise is not a function. BTW I use typescript. – Lolo. Dec 04 '15 at 06:36
-
3note that Typescript v1.7.x defines es6 promise definition file at C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TypeScript\lib.es6.d.ts – diegohb Dec 18 '15 at 22:28
-
Using that type file typescript still errors on window.Promise. I'm trying to implement a polyfil for Promise using jQuery (for IE 10). but `window.Promise = window.Promise || ...` causes an error in typescript even with the definition `///
` My target output is es5 but can use native promise if needed since the polyfill does the same. – HMR Sep 02 '16 at 04:57 -
After installing @types/es6-promise with npm, how do you include it in the .ts project? Adding it to package.json does not automatically include it in the compilation process. – Kokodoko Sep 29 '16 at 14:45
-
@Kokodoko, I updated my answer with more detailed steps; does that help you? – Dick van den Brink Sep 29 '16 at 17:28
-
Erm... but how do you include the .d.ts file in the project :) Do you need a ///ref tag or do you add it to tsconfig.json ? Also, do you need to include the index.d.ts file, or can you just include @types/es6-promise? – Kokodoko Sep 30 '16 at 09:43
-
You don't need to include it, it happens automatically because it will pickup the package.json and notice it has 'typings' for the promise package. Are you seeing otherwise? (e.g. does the above steps don't work for you?) – Dick van den Brink Sep 30 '16 at 12:37
-
2I think I have the same issue as @Kokodoko - my package.json got updated after the first statement, but its not being picked up by Intellisense (I'm using VS), it transpiles and runs though so seems like a VS Intellisense issue... Any ideas on this? I already tried restoring/installing packages, but didn't make a difference. – rumblefx0 Oct 10 '16 at 08:39
-
I ran `--save @types/es6-promise` and have my type roots setup correctly in tsconfig.json. But es6-promise refuses to be included still. – Ash Blue Dec 15 '16 at 21:32
-
2Hello. I think the flag `--save-dev` should be used instead of `--save`, as the library is only used at compile time. – m-r-r Dec 31 '16 at 15:28
-
2This is outdated. You don't have to set target to ES6 nor install a typings file. See my answer below. – paldepind Apr 07 '17 at 07:22
-
In addition, I should add this line to top of the code: `import {Promise} from 'es6-promise'`. If it is not added, this error occurs: `'Promise' only refers to a type, but is being used as a value here.` – Halil İbrahim Oymacı Sep 09 '20 at 13:07
Alternative #1
Use the target
and lib
compiler options to compile directly to es5
without needing to install the es6-shim
. (Tested with TypeScript 2.1.4
).
In the lib section, use either es2016
or es2015.promise
.
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"es2015.promise",
"dom"
]
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
Alternative #2
Use NPM to install the es6-shim
from the types organization.
npm install @types/es6-shim --save-dev
Alternative #3
Before TypeScript 2.0, use typings to install the es6-shim
globally from DefinitelyTyped.
npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
The typings
option uses npm
to install typings
globally and then uses typings
to install the shim. The dt~
prefix means to download the shim from DefinitelyTyped. The --global
option means that the shim's types will be available throughout the project.
See also
https://github.com/Microsoft/TypeScript/issues/7788 - Cannot find name 'Promise' & Cannot find name 'require'

- 133,272
- 81
- 405
- 467
-
2Including `es2016` is not a good idea unless your target supports ES2016. There is a lot of browsers that supports promises but not everything in ES2016. Use `es2015.promise` to include just the types for promises without pulling in types for everything in ES2016. – paldepind May 10 '17 at 14:01
-
As of TypeScript 2.0 you can include typings for native promises by including the following in your tsconfig.json
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
This will include the promise declarations that comes with TypeScript without having to set the target to ES6.

- 4,680
- 3
- 31
- 36
-
4This is the best answer, I think. It doesn't require changing your compile target or bringing in all the es2015 typings. – Ethan Mar 03 '17 at 20:23
-
This is an option when you only support new browsers. If you require IE10 or older android devices support you still need a polyfill. – Dick van den Brink Feb 07 '18 at 12:58
If you use node.js 0.12 or above / typescript 1.4 or above, just add compiler options like:
tsc a.ts --target es6 --module commonjs
More info: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options
If you use tsconfig.json
, then like this:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
}
}
More info: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

- 401
- 5
- 10
-
-
3@AdrianBer Actually you can, things changed. https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#support-for---target-es6-with---module – Plantain Yao Jan 17 '16 at 06:34
-
this won't work if you plan to support IE. You'll get 'syntax error' in the browser when running it. – May 10 '16 at 23:20
This the most recent way to do this, the above answer is outdated:
typings install --global es6-promise

- 911
- 1
- 9
- 16
-
Typings already exists for quite some time now but TypeScript 2.0 will allow installing definition files directly from npm (so you don't need an additional tool like typings). Updated my post with information when TypeScript 2.0 will become available. – Dick van den Brink Jun 23 '16 at 17:38
-
3We're receiving the following error: Attempted to compile "es6-promise" as a global module, but it looks like an external module. You'll need to remove the global option to continue. – Shaun Luttin Jul 05 '16 at 20:57
-
-
This is no longer the most recent way. TypeScript ships with types for Promises out of the box. There is no need to install anything. See my answer. – paldepind May 10 '17 at 13:58
Using native ES6 Promises with Typescript in Visual Studio 2015 + Node.js tools 1.2
No npm install required as ES6 Promises is native.
Node.js project -> Properties -> Typescript Build tab ECMAScript version = 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);
}
);

- 59
- 1
- 2
A. If using "target": "es5"
and TypeScript version below 2.0:
typings install es6-promise --save --global --source dt
B. If using "target": "es5"
and TypeScript version 2.0 or higer:
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
C. If using "target": "es6"
, there's no need to do anything.

- 424
- 5
- 13
-
6I'm using `"target": "es6"` with TypeScript 2.1.1 and I'm still getting `Cannot find name 'Promise'`. – zakdances Nov 21 '16 at 20:19
I had to downgrade @types/core-js
to 9.36 to get it to work with "target": "es5"
set in my tsconfig.
"@types/core-js": "0.9.36",

- 4,146
- 1
- 20
- 35
typeorm problems in tsconfig.json, add the following property : "strictPropertyInitialization": false
-
How does this resolve the problem? Please elaborate your answer. – Wiston Coronell Apr 21 '21 at 21:06