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.


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

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'

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

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

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)


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


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


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

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/**/*
    ]
}

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

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.


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.`

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 dt~core-js@0.9.7+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.


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

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

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.


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;

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.


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

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


0

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


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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.