Como usar o Typecript com promessas nativas do ES6

121

Eu sou um iniciante completo no Typescript e estou pensando se é possível usar as promessas do ES6 no Typescript e o que eu teria que fazer para fazê-las funcionar. Estou executando o nó 0.11.14 e estou recebendo um erro durante a compilação "Não foi possível encontrar o nome 'Promise'"

dchang
fonte
1
As promessas ainda não estão no Node, você precisa de um pacote, tente #es6-promise
elclanrs

Respostas:

128

O lib.d.ts atual não possui promessas definidas, portanto você precisa de um arquivo de definição extra, por isso está recebendo erros de compilação.

Você pode, por exemplo, usar (como @elclanrs diz) usar o pacote es6-promessa com o arquivo de definição de DefinitelyTyped: definição de es6-promessa

Você pode usá-lo assim:

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

editar Você pode usá-lo sem uma definição ao direcionar o ES6 (com o compilador TypeScript) - Observe que você ainda precisa que o Promise exista no tempo de execução (portanto, ele não funcionará em navegadores antigos :)) Adicione / edite o seguinte ao seu tsconfig.json:

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

edit 2 Quando o TypeScript 2.0 for lançado, as coisas mudarão um pouco (embora acima ainda funcione), mas os arquivos de definição podem ser instalados diretamente com o npm, como abaixo:

npm install --save @types/es6-promise- fonte

edit3 Atualizando resposta com mais informações para usar os tipos.

Crie um package.jsonarquivo apenas { }com o conteúdo (se você ainda não possui o package.json. Ligue npm install --save @types/es6-promisee tsc --init. O primeiro comando npm install alterará seu package.jsonpara incluir a es6-promessa como uma dependência. Tsc --init criará um tsconfig.jsonarquivo para voce.

Agora você pode usar a promessa no seu arquivo datilografado var x: Promise<any>;. Execute tsc -p .para compilar seu projeto. Você não deve ter erros.

Dick van den Brink
fonte
5
muito obrigado Dick van den Brink! em execução após uma consulta tsd es6-promessa --action install --save
dchang
3
observe que o Typescript v1.7.x define o arquivo de definição de promessa es6 em C: \ Arquivos de programas (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ Extensões comuns \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb
2
Eu acho que tenho o mesmo problema que o @Kokodoko - meu package.json foi atualizado após a primeira declaração, mas não está sendo detectado pelo Intellisense (estou usando o VS), ele transpila e executa, embora pareça um problema do VS Intellisense ... Alguma idéia sobre isso? Eu já tentei restaurar / instalar pacotes, mas não fez a diferença.
rumblefx0
2
Olá. Eu acho que o sinalizador --save-devdeve ser usado em vez de --save, como a biblioteca é usada apenas em tempo de compilação.
Mrr 31/12/16
2
Isso está desatualizado. Você não precisa definir o destino como ES6 nem instalar um arquivo de digitação. Veja minha resposta abaixo.
paldepind
50

Alternativa # 1

Use as opções targete do libcompilador para compilar diretamente es5sem precisar instalar o es6-shim. (Testado com TypeScript 2.1.4). Na seção lib, use es2016ou es2015.promise.

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

Alternativa # 2

Use o NPM para instalar a es6-shimpartir da organização de tipos .

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

Alternativa # 3

Antes do TypeScript 2.0, use as tipografias para instalar es6-shimglobalmente o DefinitelyTyped .

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

A typingsopção usa npmpara instalar typingsglobalmente e depois usa typingspara instalar o shim. O dt~prefixo significa baixar o shim de DefinitelyTyped. A --globalopção significa que os tipos de calços estarão disponíveis durante todo o projeto.

Veja também

https://github.com/Microsoft/TypeScript/issues/7788 - Não é possível encontrar o nome 'Promise' e não é possível encontrar o nome 'require'

Shaun Luttin
fonte
2
Incluir es2016não é uma boa ideia, a menos que seu destino ofereça suporte ao ES2016. Existem muitos navegadores que oferecem suporte a promessas, mas nem tudo no ES2016. Use es2015.promisepara incluir apenas os tipos de promessas sem puxar tipos para tudo no ES2016.
paldepind
23

A partir do TypeScript 2.0, você pode incluir digitações para promessas nativas, incluindo o seguinte no seu tsconfig.json

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

Isso incluirá as declarações de promessa que acompanham o TypeScript sem precisar definir o destino como ES6.

paldepind
fonte
3
Essa é a melhor resposta, eu acho. Não é necessário alterar o seu destino de compilação ou trazer todas as tipificações do es2015.
Ethan
Esta é uma opção quando você suporta apenas novos navegadores. Se você precisar de dispositivos Android IE10 ou mais antigos, ainda precisará de um polyfill.
Dick van den Brink
13

Se você usar o node.js 0.12 ou superior / typescript 1.4 ou superior, basta adicionar opções do compilador como:

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

Mais informações: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Se você usar tsconfig.json, faça o seguinte:

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

Mais informações: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

Banana Yao
fonte
Na verdade, você não pode usar commonjs e es6 juntos.
Adrian Ber
3
@AdrianBer Na verdade, você pode, as coisas mudaram. github.com/Microsoft/TypeScript/wiki/…
Plantain Yao
isso não funcionará se você planeja oferecer suporte ao IE. Você receberá 'erro de sintaxe' no navegador ao executá-lo.
RoninCoder 10/05
12

Essa é a maneira mais recente de fazer isso, a resposta acima está desatualizada:

typings install --global es6-promise

Nick Kenens
fonte
As tipografias já existem há algum tempo, mas o TypeScript 2.0 permitirá a instalação de arquivos de definição diretamente do npm (para que você não precise de uma ferramenta adicional como as tipografias). Atualizei minha postagem com informações quando o TypeScript 2.0 estiver disponível.
Dick van den Brink
3
Estamos recebendo o seguinte erro: Tentativa de compilar "es6-promessa" como um módulo global, mas parece um módulo externo. Você precisará remover a opção global para continuar.
Shaun Luttin
agora a maneira mais recente é: npm install @ type / es6-promessa --save
Berty
Essa não é mais a maneira mais recente. O TypeScript é enviado com tipos de Promessas prontos para uso. Não há necessidade de instalar nada. Veja minha resposta.
paldepind
5

Usando o ES6 Promises nativo com o Typecript nas ferramentas do Visual Studio 2015 + Node.js. 1.2

Nenhuma instalação npm necessária, pois o ES6 Promises é nativo.

Projeto Node.js -> Propriedades -> guia Compilação de Texto Escrito 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); 
    }
);
Bibek Bhattacharya
fonte
5

A. Se estiver usando "target": "es5"uma versão TypeScript abaixo de 2.0:

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

B. Se estiver usando o "target": "es5"TypeScript versão 2.0 ou higer:

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

C. Se estiver usando "target": "es6" , não há necessidade de fazer nada.

Vaz
fonte
4
Estou usando o "target": "es6"TypeScript 2.1.1 e ainda estou conseguindo Cannot find name 'Promise'.
precisa saber é o seguinte
-1

Eu tive que fazer o downgrade @types/core-jspara 9.36 para fazê-lo funcionar "target": "es5"no meu tsconfig.

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

James
fonte