159 votes

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

J'essaie d'utiliser Typescript pour mon AWS Lambda et j'obtiens les erreurs suivantes à chaque fois que j'utilise promises.

error TS2693: 'Promise' only refers to a type, but is being used as a value here.

J'ai essayé d'utiliser les variations suivantes dans le 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 dans 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 J'obtiens : [ts] 'Promise' se réfère uniquement à un type, mais est utilisé comme une valeur ici. mais pas de chance.

1 votes

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

0 votes

Tu veux dire comme ça ? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))}) Je l'ai essayé. Mais cela n'a pas aidé à résoudre le problème.

0 votes

Oui. JavaScript ne se soucie pas de savoir si vous retournez une valeur ou non, mais il n'y prête pas attention. TypeScript, en revanche, s'en soucie.

130voto

Sandro Keil Points 1127

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

{
    "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 le @types/aws-lambda ne sont plus d'actualité. Amazon livre les types Typescript avec le SDK officiel . Il n'y a pas besoin de DefinitelyTyped.

0 votes

Cela a résolu l'erreur exacte définie dans la question pour moi et je n'ai fait qu'importer rxjs, sans même utiliser Promis. Merci beaucoup !

86voto

Kenshin Points 862

J'ai rencontré la même erreur aujourd'hui et je 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

4 votes

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

0 votes

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

37voto

Nilesh Points 329

J'ai résolu ce problème 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û modifier tous les caractères du tableau de chaînes pour qu'ils soient en minuscules. Ensuite, cela a fonctionné. Merci beaucoup.

18voto

Mani S Points 1253

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

11voto

Nhan Cao Points 1430

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

Mettez la configuration ci-dessous dans tsconfig.json

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

en Options du compilateur

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

3 votes

Cela figure dans plusieurs des réponses ici et c'est important pour sûr : "Redémarrer 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