Cómo usar el mecanografiado con promesas nativas de ES6

121

Soy un principiante completo en TypeScript y me pregunto si es posible usar las promesas de ES6 en Typecript y qué tendría que hacer para que funcionen. Estoy ejecutando el nodo 0.11.14 y obtengo un error durante la compilación "No puedo encontrar el nombre 'Promesa'"

dchang
fuente
1
Las promesas aún no están en el nodo, necesita un paquete, intentees6-promise
elclanrs

Respuestas:

128

El lib.d.ts actual no tiene promesas definidas, por lo que necesita un archivo de definición adicional, por eso está obteniendo errores de compilación.

Podría, por ejemplo, usar (como dice @elclanrs) usar el paquete es6-promise con el archivo de definición de DefinitelyTyped: es6-promise definition

Luego puede usarlo así:

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

editar Puede usarlo sin una definición cuando apunta a ES6 (con el compilador TypeScript): tenga en cuenta que aún necesita que Promise exista en el curso de ejecución (por lo que no funcionará en navegadores antiguos :)) Agregue / Edite lo siguiente en su tsconfig.json:

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

edit 2 Cuando salga TypeScript 2.0, las cosas cambiarán un poco (aunque lo anterior todavía funciona) pero los archivos de definición se pueden instalar directamente con npm como a continuación:

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

edit3 Actualizando la respuesta con más información para usar los tipos.

Cree un package.jsonarchivo con solo { }el contenido (si aún no tiene un package.json. Llame npm install --save @types/es6-promisey tsc --init. El primer comando de instalación de npm cambiará package.jsonpara incluir el es6-promise como una dependencia. Tsc --init creará un tsconfig.jsonarchivo para ti.

Ahora puede usar la promesa en su archivo de mecanografía var x: Promise<any>;. Ejecute tsc -p .para compilar su proyecto. No deberías tener errores.

Dick van den Brink
fuente
55
muchas gracias Dick van den Brink! en funcionamiento después de una consulta tsd es6-promise --action install --save
dchang
3
tenga en cuenta que Typecript v1.7.x define el archivo de definición de promesa es6 en C: \ Archivos de programa (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb
2
Creo que tengo el mismo problema que @Kokodoko: mi package.json se actualizó después de la primera declaración, pero Intellisense no está recogiendo (estoy usando VS), se transpira y se ejecuta, aunque parece un problema de VS Intellisense ... ¿Alguna idea sobre esto? Ya intenté restaurar / instalar paquetes, pero no hice la diferencia.
rumblefx0
2
Hola. Creo que la bandera --save-devdebería usarse en lugar de --save, ya que la biblioteca solo se usa en tiempo de compilación.
Señor
2
Esto está desactualizado. No tiene que establecer el objetivo en ES6 ni instalar un archivo de tipificación. Vea mi respuesta a continuación.
paldepind
50

Alternativa # 1

Utilice las opciones del compilador targety libpara compilar directamente es5sin necesidad de instalar el es6-shim. (Probado con TypeScript 2.1.4). En la sección lib, use cualquiera es2016o es2015.promise.

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

Alternativa # 2

Utilice la NGP para instalar el es6-shimde la organización de tipos .

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

Alternativa # 3

Antes de TypeScript 2.0, use tipings para instalar es6-shimglobalmente desde DefinitelyTyped .

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

La typingsopción se usa npmpara instalar typingsglobalmente y luego se usa typingspara instalar la cuña. El dt~prefijo significa descargar la cuña de DefinitelyTyped. La --globalopción significa que los tipos de cuñas estarán disponibles durante todo el proyecto.

Ver también

https://github.com/Microsoft/TypeScript/issues/7788 - No se puede encontrar el nombre 'Promesa' y no se puede encontrar el nombre 'requerir'

Shaun Luttin
fuente
2
Incluir es2016no es una buena idea a menos que su objetivo sea compatible con ES2016. Hay muchos navegadores que admiten promesas, pero no todo en ES2016. Use es2015.promisepara incluir solo los tipos de promesas sin incluir tipos para todo en ES2016.
paldepind
23

A partir de TypeScript 2.0, puede incluir tipificaciones para promesas nativas incluyendo lo siguiente en su tsconfig.json

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

Esto incluirá las declaraciones de promesa que vienen con TypeScript sin tener que establecer el objetivo en ES6.

paldepind
fuente
3
Esta es la mejor respuesta, creo. No requiere cambiar su objetivo de compilación o incorporar todas las tipologías es2015.
Ethan
Esta es una opción cuando solo admite nuevos navegadores. Si necesita IE10 o dispositivos Android más antiguos, aún necesita un polyfill.
Dick van den Brink
13

Si usa node.js 0.12 o superior / typecript 1.4 o superior, simplemente agregue opciones de compilación como:

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

Más información: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Si usa tsconfig.json, entonces así:

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

Más información: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

Plátano Yao
fuente
En realidad no puedes usar commonjs y es6 juntos.
Adrian Ber
3
@AdrianBer En realidad puedes, las cosas cambiaron. github.com/Microsoft/TypeScript/wiki/…
Plantain Yao
esto no funcionará si planeas soportar IE. Obtendrá 'error de sintaxis' en el navegador cuando lo ejecute.
RoninCoder
12

Esta es la forma más reciente de hacer esto, la respuesta anterior está desactualizada:

typings install --global es6-promise

Nick Kenens
fuente
Typings ya existe desde hace bastante tiempo, pero TypeScript 2.0 permitirá instalar archivos de definición directamente desde npm (por lo que no necesita una herramienta adicional como Typings). Actualicé mi publicación con información cuando TypeScript 2.0 estará disponible.
Dick van den Brink
3
Recibimos el siguiente error: Intenté compilar "es6-promise" como un módulo global, pero parece un módulo externo. Deberá eliminar la opción global para continuar.
Shaun Luttin
ahora la forma más reciente es: npm install @ type / es6-promise --save
Berty
Esta ya no es la forma más reciente. TypeScript se entrega con los tipos de Promises listos para usar. No hay necesidad de instalar nada. Mira mi respuesta.
paldepind
5

Uso de promesas ES6 nativas con mecanografiado en Visual Studio 2015 + herramientas Node.js 1.2

No se requiere instalación npm ya que ES6 Promises es nativo.

Proyecto Node.js -> Propiedades -> pestaña Crear mecanografiado Versión 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); 
    }
);
Bibek Bhattacharya
fuente
5

A. Si usa una "target": "es5"versión TypeScript inferior a 2.0:

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

B. Si usa "target": "es5"y TypeScript versión 2.0 o superior:

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

C. Si se usa "target": "es6", no hay necesidad de hacer nada.

Vaz
fuente
44
Estoy usando "target": "es6"con TypeScript 2.1.1 y todavía estoy obteniendo Cannot find name 'Promise'.
zakdances
-1

Tuve que bajar @types/core-jsa 9.36 para que funcione con "target": "es5"set en mi tsconfig.

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

James
fuente