typescript: erreur TS2693: 'Promise' se réfère uniquement à un type, mais est utilisé comme valeur ici

144

J'essaie d'utiliser Typescript pour mon AWS Lambda et j'obtiens les erreurs suivantes partout où j'utilise des promesses.

erreur TS2693: «Promise» ne fait référence qu'à un type, mais est utilisée comme valeur ici.

J'ai essayé d'utiliser les variantes suivantes du code

Utilisation du constructeur Promise

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

en utilisant Promise.reject

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

Versions

Voici les versions de mes dépendances de développement:

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

Contenu 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"
    ]
}

J'utilise grunt-ts avec la configuration suivante pour exécuter la tâche ts.

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

J'ai essayé avec la solution mentionnée dans I get: [ts] 'Promise' se réfère uniquement à un type, mais est utilisé comme valeur ici mais pas de chance.

kalyanvgopal
la source
1
Aucune valeur de retour n'est nécessaire pour la fonction de rappel transmise au constructeur Promise. Débarrassez-vous de return.
Pointy
Voulez-vous dire comme ça? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Je l'ai essayé. Mais cela n'a pas résolu le problème.
kalyanvgopal
Oui. JavaScript ne se soucie pas de savoir si vous retournez une valeur ou non, mais il n'y prête pas attention. TypeScript, cependant, s'en soucie.
Pointy
Je l'ai. Mais pourquoi tsc ne parvient-il pas à compiler les versions de Promose.resolve ou Promise.reject?
kalyanvgopal
Ça, je ne sais pas. Comment est-il responsePromisedéclaré exactement ?
Pointy

Réponses:

122

J'ai eu le même problème avec le aws-sdket je l'ai résolu en utilisant "target": "es2015". Ceci est mon tsconfig.jsondossier.

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": false,
        "noImplicitAny": false,
        "module": "commonjs",
        "target": "es2015"
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}
Sandro Keil
la source
5
Merci Sandro. J'ai essayé la même chose mais n'a pas aidé dans mon cas.
kalyanvgopal
Peut-être qu'ils @types/aws-lambdasont périmés. Amazon fournit les types Typescript avec le SDK officiel . Il n'est pas nécessaire de définir DefinitelyTyped.
Sandro Keil
Cela a résolu l'erreur exacte définie dans la question pour moi et j'importais simplement des rxjs, sans même utiliser Promis. Merci beaucoup!
muzurB
3
C'est probablement la meilleure réponse pour ceux qui ciblaient es5 au départ. Le passage de es5 à es2015 a également résolu ce problème pour moi. Soyez averti cependant, vous verrez probablement toujours l'erreur jusqu'à ce que vous arrêtiez et redémarriez votre IDE / éditeur. Quelque chose à propos du TSC (ou de son mode de surveillance) donnait l'impression que cela ne le corrigeait pas quand c'était vraiment le cas, mais nécessitait un redémarrage de vscode.
7
mise à jour / addendum: si vous voulez toujours cibler es5 (pour un meilleur support du navigateur, et c'est important) cela fonctionne toujours tant que vous le fournissez dans vos options de compilation: "lib": ["es2015", "dom", " ScriptHost "], L'astuce pour moi était de réaliser que je devais redémarrer l'éditeur VSCode, avant qu'il ne commence à fonctionner après avoir effectué ce changement.
83

Rencontrez la même erreur aujourd'hui et résolvez-la avec:

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

Mettre à jour:

ajouter:

import {Promise} from 'es6-promise'
Kenshin
la source
3
+ et le redémarrage de VS Code aide aussi, après l'installation des types
Legends
4
Erratum: Cela fonctionne en utilisant cette ligne import {Promise} from 'es6-promise';
Loic Coenen
où ajouter "import {Promise} de 'es6-promise'"?
bArraxas
J'ai utilisé cette solution dans le passé, mais cela ne fonctionne pas pour moi pour le moment. import { Promise } from '../node_modules/es6-promise/es6-promise';, cependant, semble fonctionner correctement. Pourquoi TS ne pourrait-il pas trouver les typages installés?
snarf
35

J'ai résolu ce problème en ajoutant le code ci-dessous au fichier tsconfig.json.

"lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"]
Nilesh
la source
3
cela a fonctionné pour moi, mais notez que le tableau "lib" doit être à l'intérieur de l'objet "compilerOptions" dans le fichier tsconfig.json.
BillyRayCyrus
5
En utilisant TypeScript 2.4.1, j'ai dû changer tous les caractères du tableau de chaînes en minuscules. Ensuite, cela a fonctionné. Merci beaucoup.
JDTLH9
18

Résolu en modifiant la cible dans 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
la source
11

Voici mon conseil. Testé avec vscode 1.21.1 (sur MAC)

Mettez sous config à tsconfig.json

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

dans compilerOptions

Redémarrez IDE (cette action est requise: D)

Nhan Cao
la source
3
Ceci est répertorié dans plusieurs des réponses ici et il est important à coup sûr: "Redémarrez l'IDE (cette action est requise)"
atconway
7

J'ai eu cette erreur mais je l'ai résolue en utilisant cette commande, mon nom de fichier ts est promises-fs.ts:

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

et l'erreur est partie

Hazem HASAN
la source
5

Ajoutez la ligne ci-dessous au fichier où l'erreur est générée.Cela devrait résoudre le problème

declare var Promise: any;

PS: ce n'est certainement pas la solution optimale

Imamudin Naseem
la source
18
Il s'agit simplement de supprimer la vérification de type pour «Promise», plutôt que de la corriger afin que Typescript trouve le type correct.
edibleEnergy
1
Cette solution de contournement ne fonctionne pas avec Internet Explorer 11 par exemple. Je lance une erreur «indéfinie» en essayant d'utiliser Promise. Quoi qu'il en soit, avec Chrome, la solution de contournement fait son travail.
Calin Vlasin
1
c'est une sortie lâche. Pourquoi utiliser le TSsi vous allez faire quelque chose comme ça. Je veux dire à quoi ça sert alors?!
Hafiz Temuri
1
Je conviens que ce n’est pas optimal, mais il est injuste de dire que cette déclaration signifie qu’il n’est pas utile d’utiliser TS. L'abandon de la vérification de type sur un type ne rend pas le reste des vérifications de type inutile. Et pour moi, c'était la seule solution qui fonctionnait.
Thorkil Værge
C'est peut-être un sale hack, mais c'est la seule chose qui a fonctionné pour moi après avoir essayé toutes les autres solutions sur cette page. Au moins, mon code est compilé et fonctionne. Je creuse des hacks sales qui fonctionnent.
Jeremy Thille le
4

Enfin, tsc a commencé à fonctionner sans aucune erreur. Mais de multiples changements. Merci à Sandro Keil , Pointy & unional

  • Suppression de dt ~ aws-lambda
  • Suppression des options comme noEmit, déclaration
  • Gruntfile modifié et supprimé 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
la source
4

J'ai eu le même problème avec dactylographié et le aws-sdk. La solution était de changer la cible en es6.

Mon tsconfig.jsondossier complet :

{
        compilerOptions: {
                outDir: ./dist/,
                sourceMap: true,
                noImplicitAny: true,
                module: commonjs,
                target: es6,
                jsx: react,
                allowJs: true
        },
        include: [
                ./src/**/*
    ]
}
Fanus du Toit
la source
3
Oui, tartgeting es6 devrait résoudre ce problème, mais la compatibilité du navigateur est alors moindre. La plupart des applications ciblent encore aujourd'hui ES5, car de nombreux navigateurs ne sont toujours pas sur ES6 (à partir de 2017)
@ user2080225 bien que ce soit vrai, cela ne rend pas ma réponse moins correcte puisque la question d'origine ne mentionnait rien sur la compatibilité du navigateur. Par conséquent, cette solution pourrait encore aider les autres comme elle m'a aidé.
Fanus du Toit
3

J'ai eu le même problème jusqu'à ce que j'ajoute le tableau lib suivant dans 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
la source
2

Eh bien, cela peut être contre-intuitif, mais j'ai résolu ce problème en ajoutant esnextà mon lib.

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

Le FIX, comme suggéré par le compilateur, est de

Essayez de changer le lib option compilateur en es2015 ou version ultérieure.

Salathiel Genèse
la source
1

Core-js n'a pas fonctionné pour moi car cela a causé d'autres problèmes, cependant, l'installation de la dernière version de npm i @types/es6-promise --save-devs'est simplement débarrassée des problèmes. Les problèmes pour moi provenaient de la compilation d'un sdk qui utilisait rxjs. Voici l'erreur que j'obtenais:

`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
la source
1

Si vous utilisez le référentiel DefinatelyTyped dans votre projet, vous rencontrez peut-être ce problème récent .

Une solution de contournement décente que vous pourriez utiliser (autre que d'attendre une version mise à jour du fichier de définitions ou de refactoriser votre code TS) consiste à spécifier une version explicite + une version pour les typages core-js plutôt que de laisser Visual Studio choisir le dernier / le plus récent . J'en ai trouvé un qui ne semble pas affecté par ce problème (dans mon cas du moins), vous pouvez l'utiliser en remplaçant la ligne suivante de votre fichier package.jso n:

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

Avec le suivant:

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

Cela a résolu mon problème pour de bon. Cependant, il est fortement recommandé de supprimer la version explicite + la référence de build dès que le problème sera publié.

Pour plus d'informations sur ce problème, vous pouvez également lire cet article de blog que j'ai écrit sur le sujet.

Darkseal
la source
0

J'ai eu le même problème et cela m'a sauvé du problème en seconde:

écrivez dans la console ceci:

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

dans le fichier où le problème est copier-coller ceci:

import * as Promise from 'bluebird';
Zack Zilic
la source
0

Changez simplement la cible en "ES2017" dans le fichier tsconfig.json.

c'est mon fichier 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
la source
0

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

après la commande up, vous feriez mieux de vérifier tsconfig.json pour vous assurer que la "cible" doit être supérieure à "es6". peut-être que tsc ne prend pas encore en charge es5.

Mostone
la source
0

Aucune des réponses votées ici ne fonctionne pour moi. Voici une solution garantie et raisonnable. Placez-le en haut de tout fichier de code utilisant Promise ...

declare const Promise: any;
user1618323
la source
2
Non, ne faites pas ça ... ou n'utilisez tout simplement pas la dactylographie si vous allez faire quelque chose comme ça
Hafiz Temuri
0

Ayant passé beaucoup de temps à essayer de résoudre ce problème. Je n'ai eu aucune chance avec aucune solution proposée ici ou ailleurs.

Mais plus tard, j'ai réalisé qu'il ne s'agissait pas simplement de résoudre le problème. Mais vous devez également redémarrer le VSCODE pour qu'il prenne effet.

ravish.hacker
la source
0

J'ai eu la même erreur et je l'ai corrigée avec cette configuration:

Fichier: tsconfig.json

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

Veuillez noter que si vous exécutez la commande tsc avec un nom de fichier, par exemple:

tsc testfile.ts

alors le fichier de configuration du compilateur tsconfig.json est ignoré. La solution consiste à exécuter soit la commande tsc seule, auquel cas tous les fichiers .ts du répertoire seront compilés, sauf si vous avez modifié le tsconfig.json pour inclure un ensemble de fichiers.

voir 'utilisation de la propriété files' ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Miller le gorille
la source
0

La même erreur ici. J'ai corrigé cela, en utilisant "module": "ES6" dans tsconfig.

Kamil Naja
la source
0

Je me suis débarrassé de cette même erreur en index.ts avec ces propriétés combinées:

Dans tsconfig.json:

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

Et dans package.json:

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