web-dev-qa-db-fra.com

typescript: erreur TS2693: "Promise" fait uniquement référence à un type, mais est utilisé ici comme valeur

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

 erreur TS2693: "Promise" fait uniquement référence à un type, mais est utilisé 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}"`));

Les versions

Voici les versions de mes dépendances dev:

"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 l'exécution de la tâche ts.

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

J'ai essayé avec la solution mentionnée dans Je comprends: [ts] "Promise" fait uniquement référence à un type, mais est utilisé comme valeur ici mais pas de chance.

119
kalyanvgopal

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

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": false,
        "noImplicitAny": false,
        "module": "commonjs",
        "target": "es2015"
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}
107
Sandro Keil

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'
71
Kenshin

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

"lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"]
30
Nilesh

Résolu en changeant le target 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
}
}
17
Mani S

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

Mettez ci-dessous config à tsconfig.json

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

dans compilerOptions

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

10
Nhan Cao

Ajouter la ligne ci-dessous au fichier dans lequel une erreur est générée. Cela devrait résoudre le problème.

declare var Promise: any;
8
Imamudin Naseem

Avait le même problème avec TypeScript et le aws-sdk. La solution consistait à changer la cible en es6.

Mon fichier tsconfig.json complet:

{
        compilerOptions: {
                outDir: ./dist/,
                sourceMap: true,
                noImplicitAny: true,
                module: commonjs,
                target: es6,
                jsx: react,
                allowJs: true
        },
        include: [
                ./src/**/*
    ]
}
3
Fanus du Toit

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

  • Suppression de dt ~ aws-lambda
  • Options supprimées comme noEmit, déclaration
  • Gruntfile modifié et ignore 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"
                }
            },
...
3
kalyanvgopal

J'ai eu le même problème jusqu'à ce que j'ai ajouté 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"]
}
2
Jon Gear

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

declare const Promise: any;
2
user1618323

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

1
Hazem HASAN

Cela peut sembler 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 remplacer l'option lib du compilateur par es2015 ou une version ultérieure.

1
Salathiel Genèse

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

écrire dans la console ceci:

npm i --save bluebird
npm i --save-dev @types/bluebird @types/[email protected]

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

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

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

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

0
Mostone

Il suffit de changer 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"
  ]
}
0
Camilo Soto

Après avoir passé beaucoup de temps à essayer de résoudre ce problème. Je n'ai eu aucune chance avec aucune solution fournir ici ou ailleurs.

Mais plus tard, il s'est rendu compte que ce n'était pas tant que résoudre le problème. Mais vous devez également redémarrer le VSCODE pour qu'il prenne effet.

0
ravish.hacker

J'utilise la bibliothèque "promise-polyfill", qui peut être la cause de mon problème.

J'ai ajouté cette importation en haut de mon fichier:

import {Promise} from 'es6-promise';
0
Matthias Dailey

Core-js ne fonctionnait pas pour moi car cela posait d'autres problèmes. Cependant, installer simplement la dernière version de npm i @types/es6-promise --save-dev s'est débarrassé de ces problèmes. Les problèmes pour moi provenaient de la compilation d’un sdk utilisant rxjs. Voici l'erreur que je devenais:

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

Si vous utilisez le référentiel DefinitelyTyped dans votre projet, il se peut que vous rencontriez ce problème récent .

Une solution de contournement décente que vous pouvez 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 génération 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 être affecté par ce problème (dans mon cas du moins), vous pouvez l'utiliser pour remplacer 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 compilation dès que le problème sera publié.

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

0
Darkseal