mecanografiado: error TS2693: 'Promesa' solo se refiere a un tipo, pero aquí se usa como un valor

144

Estoy tratando de usar Typecript para mi AWS Lambda y recibo los siguientes errores donde uso promesas.

error TS2693: 'Promesa' solo se refiere a un tipo, pero aquí se está utilizando como valor.

Intenté usar las siguientes variaciones en el código

Usando el constructor Promise

responsePromise = new Promise((resolve, reject) => {
                    return reject(new Error(`missing is needed data`))
                })

usando Promise.reject

responsePromise = Promise.reject(new Error(`Unsupported method "${request.httpMethod}"`));

Versiones

Las siguientes son las versiones en mis dependencias de desarrollo:

"typescript": "^2.2.2"
"@types/aws-lambda": "0.0.9",
"@types/core-js": "^0.9.40",
"@types/node": "^7.0.12",

Contenido de tsconfig.json

{
    "compileOnSave": true,
    "compilerOptions": {
        "module": "commonjs",
        // "typeRoots" : ["./typings", "./node_modules/@types"],
        "target": "es5",
        // "types" : [ "core-js" ],
        "noImplicitAny": true,
        "strictNullChecks": true,
        "allowJs": true,
        "noEmit": true,
        "alwaysStrict": true,
        "preserveConstEnums": true,
        "sourceMap": true,
        "outDir": "dist",
        "moduleResolution": "Node",
        "declaration": true,
        "lib": [
            "es6"
        ]
    },
    "include": [
        "index.ts",
        "lib/**/*.ts"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}

Estoy usando grunt-ts con la siguiente configuración para ejecutar la tarea ts.

ts: {
            app: {
                tsconfig: {
                    tsconfig: "./tsconfig.json",
                    ignoreSettings: true
                }
            },
...

Intenté con la solución mencionada en I get: [ts] 'Promise' solo se refiere a un tipo, pero aquí se está utilizando como un valor, pero sin suerte.

kalyanvgopal
fuente
1
No se necesita ningún valor de retorno para la función de devolución de llamada transmitida al constructor Promise. Solo deshazte de él return.
Pointy
Quieres decir así? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Lo intenté. Pero no ayudó con el problema.
kalyanvgopal
Si. A JavaScript no le importa si devuelve un valor o no, pero no le prestará atención. TypeScript, sin embargo, se preocupa.
Pointy
Entendido. Pero, ¿por qué tsc no puede compilar ningún sabor de Promose.resolve o Promise.reject?
kalyanvgopal
Eso no lo sé. ¿Cómo se responsePromisedeclara exactamente ?
Pointy

Respuestas:

122

Tuve el mismo problema con el aws-sdky lo resolví usando "target": "es2015". Este es mi tsconfig.jsonarchivo

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": false,
        "noImplicitAny": false,
        "module": "commonjs",
        "target": "es2015"
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}
Sandro Keil
fuente
55
Gracias Sandro Intenté lo mismo pero no ayudó en mi caso.
kalyanvgopal
Tal vez los @types/aws-lambdaestán desactualizados. Amazon envía tipos de mecanografía con el SDK oficial . No hay necesidad de DefinitelyTyped.
Sandro Keil
Eso resolvió el error exacto definido en la pregunta para mí y solo estaba importando rxjs, ni siquiera usando Promis. ¡Muchas gracias!
muzurB
3
Para empezar, esta es probablemente la mejor respuesta para aquellos que estaban apuntando a es5. Cambiar de es5 a es2015 también me solucionó esto. Sin embargo, tenga en cuenta que probablemente verá el error hasta que cierre y reinicie su IDE / editor. Algo sobre el TSC (o su modo de reloj) estaba haciendo que pareciera que esto no lo estaba arreglando cuando realmente era, sino que requería un reinicio de vscode.
77
actualización / anexo: si aún desea apuntar a es5 (para un mejor soporte del navegador, y es importante), eso todavía funciona siempre y cuando proporcione esto en las opciones de su compilador: "lib": ["es2015", "dom", " ScriptHost "], el truco para mí fue darme cuenta de que tenía que reiniciar el editor VSCode, antes de que comenzara a funcionar después de hacer ese cambio.
83

Encuentra el mismo error hoy y resuélvelo con:

npm i --save-dev  @types/es6-promise

Actualizar:

añadir:

import {Promise} from 'es6-promise'
Kenshin
fuente
3
+ y reiniciar VS Code también ayuda, después de la instalación de los tipos
Legends
44
Errata: Funciona usando esta línea import {Promise} from 'es6-promise';
Loic Coenen
¿dónde agregar "import {Promise} de 'es6-promise'"?
bArraxas
He usado esta solución en el pasado, pero no me funciona en este momento. import { Promise } from '../node_modules/es6-promise/es6-promise';, sin embargo, parece estar funcionando bien. ¿Por qué TS no podría encontrar los tipings instalados?
snarf
35

Resolví esto agregando el siguiente código al archivo tsconfig.json.

"lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"]
Nilesh
fuente
3
esto funcionó para mí, pero tenga en cuenta que la matriz "lib" debe estar dentro del objeto "compilerOptions" en el archivo tsconfig.json.
BillyRayCyrus
55
Usando TypeScript 2.4.1 tuve que cambiar todos los caracteres en la matriz de cadenas para que fueran minúsculas. Entonces funcionó. Muchas gracias.
JDTLH9
18

Resuelto cambiando el objetivo en compilerOptions.

{
"compilerOptions": {
    "module": "es2015",
    "target": "es2015",
    "lib": [
        "es2016",
        "dom"
    ],
    "moduleResolution": "node",
    "noImplicitAny": false,
    "sourceMap": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "outDir": "./public/js/app"
},
"exclude": [
    "node_modules",
    "public/js",
    "assets/app/polyfills.ts"
],
"angularCompilerOptions": {
    "skipMetadataEmit": true
}
}
Mani S
fuente
11

Aquí está mi consejo. Probado con vscode 1.21.1 (en MAC)

Poner abajo config a tsconfig.json

"lib": [
"es2016",
"dom"
]

en compilador

Reiniciar IDE (se requiere esta acción: D)

Nhan Cao
fuente
3
Esto se enumera en varias de las respuestas aquí y es importante con seguridad: "Reiniciar IDE (se requiere esta acción)"
entrada el
7

Tuve este error pero lo resolví usando este comando, mi nombre de archivo ts es promises-fs.ts:

tsc promises-fs.ts --target es6 && node promises-fs.js

y el error se fue

Hazem HASAN
fuente
5

Agregue la siguiente línea al archivo donde se está generando el error. Esto debería solucionar el problema

declare var Promise: any;

PD: esta definitivamente no es la solución óptima

Imamudin Naseem
fuente
18
Esto es solo eliminar la verificación de tipo para 'Promesa', en lugar de arreglarlo para que Typecript encuentre el tipo correcto.
edibleEnergy
1
Esta solución alternativa no funciona con Internet Explorer 11, por ejemplo. Lanzo un error 'indefinido' cuando intento usar Promise. De todos modos con Chrome, la solución hace su trabajo.
Calin Vlasin
1
Esa es una salida cobarde. ¿Por qué usar el TSsi vas a hacer algo como esto? Quiero decir, ¿qué sentido tiene entonces?
Hafiz Temuri
1
Estoy de acuerdo en que esto no es óptimo, pero es injusto decir que esta declaración significa que no tiene sentido usar TS. Dejar caer la comprobación de tipo en un tipo no hace que el resto de las comprobaciones de tipo sean inútiles. Y para mí, esta fue la única solución que funcionó.
Thorkil Værge
Puede ser un truco sucio, pero es lo único que funcionó para mí después de probar todas las demás soluciones en esta página. Al menos tengo mi código compilado y funcionando. Cavo trucos sucios que funcionan.
Jeremy Thille
4

Finalmente tsc comenzó a funcionar sin ningún error. Pero múltiples cambios. Gracias a Sandro Keil , Pointy & unional

  • Se eliminó dt ~ aws-lambda
  • Opciones eliminadas como noEmit, declaración
  • Gruntfile modificado y eliminado ignoreSettings

tsconfig.json

{
    "compileOnSave": true,
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "strictNullChecks": true,
        "alwaysStrict": true,
        "preserveConstEnums": true,
        "sourceMap": false,
        "moduleResolution": "Node",
        "lib": [
            "dom",
            "es2015",
            "es5",
            "es6"
        ]
    },
    "include": [
        "*",
        "src/**/*"
    ],
    "exclude": [
        "./node_modules"
    ]
}

Gruntfile.js

ts: {
            app: {
                tsconfig: {
                    tsconfig: "./tsconfig.json"
                }
            },
...
kalyanvgopal
fuente
4

Tuve el mismo problema con el mecanografiado y el aws-sdk. La solución fue cambiar el objetivo aes6 .

Mi tsconfig.jsonarchivo completo :

{
        compilerOptions: {
                outDir: ./dist/,
                sourceMap: true,
                noImplicitAny: true,
                module: commonjs,
                target: es6,
                jsx: react,
                allowJs: true
        },
        include: [
                ./src/**/*
    ]
}
Fanus du Toit
fuente
3
Sí, tartgeting es6 debería solucionarlo, pero entonces tienes menos compatibilidad con el navegador. La mayoría de las aplicaciones todavía se dirigen hoy a es5, porque muchos navegadores aún no están en es6 (a partir de 2017)
@ user2080225 aunque eso es cierto, no hace que mi respuesta sea menos correcta, ya que la pregunta original no decía nada sobre la compatibilidad del navegador. Por lo tanto, esta solución aún podría ayudar a otros como me ayudó.
Fanus du Toit
3

Tuve el mismo problema hasta que agregué la siguiente matriz lib en typeScript 3.0.1

tsconfig.json

{
  "compilerOptions": {
    "outDir": "lib",
    "module": "commonjs",
    "allowJs": false,
    "declaration": true,
    "target": "es5",
    "lib": ["dom", "es2015", "es5", "es6"],
    "rootDir": "src"
  },
  "include": ["./**/*"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}
Jon Gear
fuente
2

Bueno, esto podría ser contra-intuitivo, pero resolví esta adición esnexta mi lib.

{
  "compilerOptions": {
    "lib": [
        "esnext"
    ],
    "target": "es5",
  }
}

El FIX, como lo sugiere el compilador es

Intente cambiar la libopción del compilador a es2015 o posterior.

Salathiel Genèse
fuente
1

Core-js no funcionó para mí ya que causó otros problemas, sin embargo, simplemente instalando la última versión de npm i @types/es6-promise --save-develiminé los problemas. Los problemas para mí surgieron de compilar un sdk que usaba rxjs. Aquí está el error que estaba recibiendo:

`node_modules/rxjs/Observable.d.ts(59,60): error TS2693: Promise only refers to a type, but is being used as a value here.`
Danny Fenstermaker
fuente
1

Si está utilizando el repositorio DefinitelyTyped en su proyecto, puede estar experimentando este problema reciente .

Una solución decente que podría usar (aparte de esperar una compilación actualizada del archivo de definiciones o refactorizar su código TS) es especificar una versión explícita + compilación para los tipos de core-js en lugar de dejar que Visual Studio elija la última / más reciente . Encontré uno que parece no verse afectado por este problema (al menos en mi caso), puede usarlo reemplazando la siguiente línea de su archivo package.jso n:

  "scripts": {
    "postinstall": "typings install dt~core-js --global"
  }

Con el siguiente:

  "scripts": {
    "postinstall": "typings install [email protected]+20161130133742 --global"
  }

Esto solucionó mi problema para siempre. Sin embargo, es muy recomendable eliminar la versión explícita + referencia de compilación tan pronto como se publique el problema.

Para obtener más información sobre este tema, también puede leer esta publicación de blog que escribí sobre el tema.

Darkseal
fuente
0

Tuve el mismo problema y esto me salvó del problema en segundo lugar:

escribe en la consola esto:

npm i --save bluebird
npm i --save-dev @types/bluebird @types/core-js@0.9.36

en el archivo donde el problema es copiar, pegue esto:

import * as Promise from 'bluebird';
Zack Zilic
fuente
0

Simplemente cambie el objetivo a "ES2017" en el archivo tsconfig.json.

este es mi archivo tsconfig.json

{
"compilerOptions": {
/* Basic Options */
    "target": "ES2017",   /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "declaration": true,  /* Generates corresponding '.d.ts' file. */
    "sourceMap": true,    /* Generates corresponding '.map' file. */
    "outDir": "./dist",   /* Redirect output structure to the directory. */
    "strict": true        /* Enable all strict type-checking options. */
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules"
  ]
}
Camilo Soto
fuente
0

npm i --save-dev @ types / es6-promise

después del comando up, será mejor que compruebe tsconfig.json y asegúrese de que el "objetivo" debe ser mejor que "es6". tal vez tsc no es compatible con es5 todavía.

Mostone
fuente
0

Ninguna de las respuestas votadas aquí funciona para mí. Aquí hay una solución garantizada y razonable. Coloque esto cerca de la parte superior de cualquier archivo de código que use Promise ...

declare const Promise: any;
usuario1618323
fuente
2
No, no hagas esto ... o simplemente no uses el mecanografiado si vas a hacer algo como esto
Hafiz Temuri
0

Habiendo pasado mucho tiempo tratando de arreglar esto. No tuve suerte con ninguna solución que proporcionara aquí o en otro lado.

Pero luego se dio cuenta de que no se trataba solo de resolver el problema. Pero también debe reiniciar el VSCODE para que surta efecto.

ravish.hacker
fuente
0

Tuve el mismo error y lo arreglé con esta configuración:

Archivo: tsconfig.json

{
  "compilerOptions": {
    "target": "es2015",                      
    "module": "commonjs",                    
    "strict": true,                          
    "esModuleInterop": true                  
  }
}
Jonathan Mendoza
fuente
0

Tenga en cuenta que si está ejecutando el comando tsc con un nombre de archivo, es decir:

tsc testfile.ts

entonces se ignora el archivo de configuración del compilador tsconfig.json. La solución es ejecutar el comando tsc por sí solo, en cuyo caso se compilarán todos los archivos .ts del directorio, a menos que haya editado tsconfig.json para incluir un conjunto de archivos.

consulte 'uso de la propiedad de archivos' ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Miller el gorila
fuente
0

El mismo error aquí. Arreglé esto, usando "módulo": "ES6" en tsconfig.

Kamil Naja
fuente
0

Me deshice de este mismo error en index.ts con estas propiedades combinadas:

En tsconfig.json:

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

Y en package.json:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
Washington Guedes
fuente