173 votes

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

Je tente d'utiliser Typescript pour mon AWS Lambda et je reçois les erreurs suivantes partout où j'utilise des promesses.

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

J'ai essayé d'utiliser les variations suivantes dans le code

Utilisation du constructeur Promise

responsePromise = new Promise((resolve, reject) => {
                    return reject(new Error(`les données nécessaires sont manquantes`))
                })

utilisation de Promise.reject

responsePromise = Promise.reject(new Error(`méthode non supportée "${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é la solution mentionnée dans Je reçois : [ts] 'Promise' ne fait référence qu'à un type, mais est utilisé comme une valeur ici mais sans succès.

1 votes

Aucune valeur de retour n'est nécessaire pour la fonction de rappel passée au constructeur de Promesses. Il suffit de se débarrasser de return.

0 votes

Voici la traduction en français en conservant les balises HTML si elles existent : Veux-tu dire quelque chose comme ceci ? responsePromise = new Promise((resolve, reject) => { reject(new Error("données manquantes"))}) J'ai essayé mais cela n'a pas aidé avec le problème.

0 votes

Oui. JavaScript se moque de savoir si vous retournez une valeur ou non, mais il n'y prêtera pas attention. En revanche, TypeScript y prêtera attention.

135voto

Sandro Keil Points 1127

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

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

5 votes

Merci Sandro. J'ai essayé la même chose mais cela n'a pas aidé dans mon cas.

0 votes

Peut-être que les @types/aws-lambda sont obsolètes. Amazon fournit des types Typescript avec le SDK officiel. Il n'est pas nécessaire d'utiliser DefinitelyTyped.

0 votes

Cela a résolu l'erreur exacte définie dans la question pour moi et j'importais juste rxjs, sans même utiliser Promis. Merci beaucoup!

93voto

Kenshin Points 862

Rencontrez la même erreur aujourd'hui et l'ai résolue avec :

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

Mise à jour :

ajouter :

import {Promise} from 'es6-promise'

4 votes

+ et redémarrer VS Code aide aussi, après l'installation des types

5 votes

Erratum: Cela fonctionne en utilisant cette ligne import {Promise} from 'es6-promise';

0 votes

Où ajouter "import {Promise} from 'es6-promise'" ?

40voto

Nilesh Points 329

J'ai résolu cela en ajoutant le code ci-dessous au fichier tsconfig.json.

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

3 votes

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.

5 votes

En utilisant TypeScript 2.4.1, j'ai dû changer tous les caractères dans le tableau de chaînes en minuscules. Ensuite, cela a fonctionné. Merci beaucoup.

18voto

Mani S Points 1253

Résolu en changeant 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
}
}

12voto

Nhan Cao Points 1430

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

Placer la configuration ci-dessous dans tsconfig.json

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

dans compilerOptions

Redémarrer l'IDE (cette action est requise :D )

3 votes

Cela figure dans plusieurs des réponses ici et c'est important c'est sûr : "Redémarrez l'IDE (cette action est requise)"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X