Typoskript: Fehler TS2693: 'Versprechen' bezieht sich nur auf einen Typ, wird hier jedoch als Wert verwendet

144

Ich versuche, Typescript für mein AWS Lambda zu verwenden, und es werden die folgenden Fehler angezeigt, wenn ich Versprechen verwende.

Fehler TS2693: 'Versprechen' bezieht sich nur auf einen Typ, wird hier jedoch als Wert verwendet.

Ich habe versucht, die folgenden Variationen im Code zu verwenden

Verwenden des Promise-Konstruktors

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

mit Promise.reject

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

Versionen

Im Folgenden sind die Versionen in meinen Entwicklungsabhängigkeiten aufgeführt:

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

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

Ich verwende grunt-ts mit der folgenden Konfiguration zum Ausführen der ts-Aufgabe.

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

Ich habe es mit der in I get genannten Lösung versucht : [ts] 'Versprechen' bezieht sich nur auf einen Typ, wird hier aber als Wert verwendet, hat aber kein Glück.

kalyanvgopal
quelle
1
Für die an den Promise-Konstruktor übergebene Rückruffunktion ist kein Rückgabewert erforderlich. Einfach loswerden return.
Pointy
Meinst du so? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Ich versuchte es. Aber das Problem war nicht gelöst.
kalyanvgopal
Ja. JavaScript ist es egal, ob Sie einen Wert zurückgeben oder nicht, aber es wird nicht darauf geachtet. TypeScript kümmert sich jedoch darum.
Pointy
Verstanden. Aber warum kompiliert tsc keine Version von Promose.resolve oder Promise.reject?
kalyanvgopal
Das weiß ich nicht. Wie genau wird responsePromisedeklariert?
Pointy

Antworten:

122

Ich hatte das gleiche Problem mit dem aws-sdkund habe es mit gelöst "target": "es2015". Das ist meine tsconfig.jsonAkte.

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": false,
        "noImplicitAny": false,
        "module": "commonjs",
        "target": "es2015"
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}
Sandro Keil
quelle
5
Danke Sandro. Versuchte das gleiche, half aber in meinem Fall nicht.
kalyanvgopal
Vielleicht @types/aws-lambdasind die veraltet. Amazon liefert Typescript-Typen mit dem offiziellen SDK . DefinitelyTyped ist nicht erforderlich.
Sandro Keil
Das löste den genauen Fehler, der in der Frage für mich definiert war, und ich importierte nur rxjs, nicht einmal Promis. Vielen Dank!
MuzurB
3
Dies ist wahrscheinlich die beste Antwort für diejenigen, die zunächst auf es5 abzielten. Der Wechsel von es5 zu es2015 hat dies auch für mich behoben. Seien Sie jedoch gewarnt, Sie werden den Fehler wahrscheinlich immer noch sehen, bis Sie Ihre IDE / Ihren Editor herunterfahren und neu starten. Etwas an der TSC (oder ihrem Überwachungsmodus) ließ den Anschein erwecken, dass dies nicht behoben wurde, als es wirklich war, sondern einen Neustart von vscode erforderte.
7
Update / Nachtrag: Wenn Sie weiterhin auf es5 abzielen möchten (für eine bessere Browserunterstützung und wichtig), funktioniert dies weiterhin, solange Sie dies in Ihren Compileroptionen angeben: "lib": ["es2015", "dom", " ScriptHost "], Der Trick für mich war zu erkennen, dass ich den VSCode-Editor neu starten musste, bevor er nach dieser Änderung funktionieren würde.
83

Stoßen Sie heute auf denselben Fehler und lösen Sie ihn mit:

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

Aktualisieren:

hinzufügen:

import {Promise} from 'es6-promise'
Kenshin
quelle
3
+ und ein Neustart von VS Code hilft auch nach der Installation der Typen
Legends
4
Erratum: Es funktioniert mit dieser Linie import {Promise} from 'es6-promise';
Loic Coenen
Wo kann man "{Promise} aus 'es6-versprechen' importieren" hinzufügen?
bArraxas
Ich habe diese Lösung in der Vergangenheit verwendet, aber sie funktioniert im Moment nicht für mich. import { Promise } from '../node_modules/es6-promise/es6-promise';scheint jedoch gut zu funktionieren. Warum kann TS die installierten Typisierungen nicht finden?
Snarf
35

Ich habe dieses Problem gelöst, indem ich der Datei tsconfig.json den folgenden Code hinzugefügt habe.

"lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"]
Nilesh
quelle
3
Dies hat bei mir funktioniert, aber beachten Sie, dass sich das Array "lib" innerhalb des Objekts "compilerOptions" in der Datei tsconfig.json befinden muss.
BillyRayCyrus
5
Mit TypeScript 2.4.1 musste ich alle Zeichen im String-Array in Kleinbuchstaben ändern. Dann hat es funktioniert. Danke vielmals.
JDTLH9
18

Gelöst durch Ändern des Ziels in 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.
quelle
11

Hier ist mein Tipp. Getestet mit vscode 1.21.1 (auf MAC)

Fügen Sie die folgende Konfiguration in tsconfig.json ein

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

in compilerOptions

Starten Sie die IDE neu (diese Aktion ist erforderlich: D)

Nhan Cao
quelle
3
Dies ist in mehreren der Antworten hier aufgeführt und es ist sicher wichtig : "IDE neu
starten
7

Ich hatte diesen Fehler, aber ich habe ihn mit diesem Befehl behoben. Mein ts-Dateiname lautet Versprechen-fs.ts:

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

und der Fehler ist weg

Hazem HASAN
quelle
5

Fügen Sie die folgende Zeile zu der Datei hinzu, in der der Fehler ausgelöst wird. Dies sollte das Problem beheben

declare var Promise: any;

PS: Dies ist definitiv nicht die optimale Lösung

Imamudin Naseem
quelle
18
Dies entfernt lediglich die Typprüfung für "Versprechen", anstatt sie zu korrigieren, damit Typescript den richtigen Typ findet.
essbare Energie
1
Diese Problemumgehung funktioniert beispielsweise nicht mit Internet Explorer 11. Ich versuche einen 'undefinierten' Fehler, wenn ich versuche, Promise zu verwenden. Wie auch immer, mit Chrome macht die Problemumgehung seinen Job.
Calin Vlasin
1
Das ist ein feiger Ausweg. Warum das verwenden, TSwenn Sie so etwas tun wollen? Ich meine, was ist dann der Sinn?!
Hafiz Temuri
1
Ich stimme zu, dass dies nicht optimal ist, aber es ist unfair zu sagen, dass diese Erklärung bedeutet, dass es keinen Sinn macht, TS zu verwenden. Das Löschen von Typechecks auf einen Typ macht den Rest der Typechecks nicht nutzlos. Und für mich war dies die einzige Lösung, die funktioniert hat.
Thorkil Værge
Mag ein schmutziger Hack sein, aber es ist das einzige, was für mich funktioniert hat, nachdem ich alle anderen Lösungen auf dieser Seite ausprobiert habe. Zumindest habe ich meinen Code kompiliert und funktioniert. Ich grabe schmutzige Hacks, die funktionieren.
Jeremy Thille
4

Schließlich begann tsc fehlerfrei zu arbeiten. Aber mehrere Änderungen. Vielen Dank an Sandro Keil , Pointy & unional

  • Dt ~ aws-lambda entfernt
  • Optionen wie noEmit, Deklaration wurden entfernt
  • Gruntfile geändert und ignoreSettings entfernt

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
quelle
4

Hatte das gleiche Problem mit Typoskript und dem aws-sdk. Die Lösung bestand darin, das Ziel auf zu ändernes6 .

Meine vollständige tsconfig.jsonDatei:

{
        compilerOptions: {
                outDir: ./dist/,
                sourceMap: true,
                noImplicitAny: true,
                module: commonjs,
                target: es6,
                jsx: react,
                allowJs: true
        },
        include: [
                ./src/**/*
    ]
}
Fanus du Toit
quelle
3
Ja, das Starten von es6 sollte das Problem beheben, aber dann haben Sie weniger Browserkompatibilität. Die meisten Apps zielen heute noch auf es5 ab, da viele Browser noch nicht auf es6 sind (Stand 2017)
@ user2080225 Obwohl das stimmt, macht es meine Antwort nicht weniger richtig, da die ursprüngliche Frage nichts über die Browserkompatibilität aussagte. Daher könnte diese Lösung auch anderen helfen, so wie es mir geholfen hat.
Fanus du Toit
3

Ich hatte das gleiche Problem, bis ich das folgende lib-Array in typeScript 3.0.1 hinzufügte

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
quelle
2

Nun, das mag kontraintuitiv sein, aber ich habe dieses Hinzufügen esnextzu meinem Problem gelöst lib.

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

Das FIX, wie vom Compiler vorgeschlagen, ist zu

Versuchen Sie, die libCompiler-Option auf es2015 oder höher zu ändern.

Salathiel Genèse
quelle
1

Core-js funktionierte bei mir nicht, da es andere Probleme verursachte. Durch einfaches Installieren der neuesten Version npm i @types/es6-promise --save-devvon wurden die Probleme jedoch behoben . Die Probleme für mich waren auf das Kompilieren eines SDK zurückzuführen, der rxjs verwendete. Hier ist der Fehler, den ich bekommen habe:

`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
quelle
1

Wenn Sie das DefinitelyTyped- Repository in Ihrem Projekt verwenden, tritt möglicherweise dieses aktuelle Problem auf .

Eine angemessene Problemumgehung, die Sie möglicherweise verwenden (außer auf einen aktualisierten Build der Definitionsdatei zu warten oder Ihren TS-Code umzugestalten), besteht darin, eine explizite Version + Build für die Core-js-Typisierungen anzugeben, anstatt Visual Studio die neueste / neueste auswählen zu lassen . Ich habe eine gefunden, die von diesem Problem nicht betroffen zu sein scheint (zumindest in meinem Fall). Sie können sie verwenden, um die folgende Zeile aus Ihrer Datei package.jso n zu ersetzen :

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

Mit dem folgenden:

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

Dies hat mein Problem endgültig behoben. Es wird jedoch dringend empfohlen, die explizite Version + Build-Referenz zu entfernen, sobald das Problem veröffentlicht wird.

Für weitere Informationen zu diesem Problem können Sie auch diesen Blog-Beitrag lesen , den ich zu diesem Thema geschrieben habe.

Darkseal
quelle
0

Ich hatte das gleiche Problem und dies rettete mich in zweiter Sekunde vor dem Problem:

Schreiben Sie dies in die Konsole:

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

Fügen Sie in die Datei, in der das Problem das Kopieren ist, Folgendes ein:

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

Ändern Sie einfach das Ziel in der Datei tsconfig.json in "ES2017".

Dies ist meine tsconfig.json-Datei

{
"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
quelle
0

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

Nach dem Befehl up sollten Sie tsconfig.json überprüfen, um sicherzustellen, dass das "Ziel" größer als "es6" sein muss. Vielleicht unterstützt tsc es5 noch nicht.

Mostone
quelle
0

Keine der hier abgestimmten Antworten funktioniert für mich. Hier ist eine garantierte und vernünftige Lösung. Fügen Sie dies oben in jede Codedatei ein, die Promise verwendet ...

declare const Promise: any;
user1618323
quelle
2
Nein, tu das nicht ... oder benutze einfach nicht das Typoskript, wenn du so etwas machen willst
Hafiz Temuri
0

Ich habe viel Zeit damit verbracht, dies zu beheben. Ich hatte kein Glück mit einer Lösung hier oder anderswo.

Aber später wurde mir klar, dass es nicht nur darum ging, das Problem zu lösen. Sie müssen den VSCODE jedoch auch neu starten, damit er wirksam wird.

ravish.hacker
quelle
0

Ich hatte den gleichen Fehler und habe ihn mit folgender Konfiguration behoben:

Datei: tsconfig.json

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

Beachten Sie Folgendes: Wenn Sie den Befehl tsc mit einem Dateinamen ausführen, z.

tsc testfile.ts

Dann wird die Compiler-Konfigurationsdatei tsconfig.json ignoriert. Die Lösung besteht darin, entweder den Befehl tsc selbst auszuführen. In diesem Fall werden alle .ts-Dateien im Verzeichnis kompiliert, es sei denn, Sie haben die Datei tsconfig.json so bearbeitet, dass sie eine Reihe von Dateien enthält.

Siehe 'Verwenden der Eigenschaft files' ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Müller der Gorilla
quelle
0

Der gleiche Fehler hier. Ich habe dies mit "module": "ES6" in tsconfig behoben.

Kamil Naja
quelle
0

Ich habe den gleichen Fehler index.tsmit diesen kombinierten Eigenschaften beseitigt:

In tsconfig.json:

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

Und in package.json:

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