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


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.


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'


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.


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


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


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

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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.