Home » Javascript » How to use Typescript with native ES6 Promises

How to use Typescript with native ES6 Promises

Posted by: admin November 30, 2017 Leave a comment

Questions:

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'”

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-promisesource

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.

Questions:
Answers:

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’

Questions:
Answers:

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

Questions:
Answers:

This the most recent way to do this, the above answer is outdated:

typings install --global es6-promise

Questions:
Answers:

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.

Questions:
Answers:

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); 
    }
);

Questions:
Answers:

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.

Questions:
Answers:

If you have an angular 2 CLI project you just do: npm install --save @types/es6-promise and you are good to go. This is a relatively new change (as of today 1 oct 2016) and is the recommended way for adding types.

But make sure in your tsconfig.json you have:

compilerOptions: {

    ......
    "typeRoots": [
        "../node_modules/@types" // here is the recommended place to add types now..
    ]

}

Questions:
Answers:

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",

Questions:
Answers:

For me I just did

import { promise } from 'protractor'