dattiloscritto: errore TS2693: "Promessa" si riferisce solo a un tipo, ma qui viene utilizzato come valore


144

Sto cercando di usare Typescript per il mio AWS Lambda e ricevo i seguenti errori ogni volta che utilizzo promesse.

errore TS2693: "Promessa" si riferisce solo a un tipo, ma qui viene utilizzato come valore.

Ho provato a utilizzare le seguenti variazioni nel codice

Utilizzando il costruttore Promise

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

usando Promise.reject

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

versioni

Di seguito sono riportate le versioni nelle mie dipendenze di sviluppo:

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

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

Sto usando grunt-ts con la seguente configurazione per eseguire ts task.

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

Ho provato con la soluzione menzionata in I get: [ts] 'Promise' si riferisce solo a un tipo, ma qui viene usato come valore ma senza fortuna.


1
Non è necessario alcun valore restituito per la funzione di callback passata al costruttore Promise. Liberati di return.
Punta a punta il

Intendi in questo modo? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})L'ho provato. Ma non ha affrontato il problema.
Kalyanvgopal,

Sì. A JavaScript non importa se restituisci un valore o meno, ma non ti presterà attenzione. A TypeScript, tuttavia, importa.
Punta a punta il

Fatto. Ma perché tsc non riesce a compilare alcun sapore di Promose.resolve o Promise.reject?
Kalyanvgopal,

Questo non lo so. Come viene responsePromisedichiarato esattamente ?
Punta a punta il

Risposte:


122

Ho avuto lo stesso problema con aws-sdke l'ho risolto usando "target": "es2015". Questo è il mio tsconfig.jsonfile

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

5
Grazie Sandro. Ho provato lo stesso ma non ha aiutato nel mio caso.
Kalyanvgopal,

Forse @types/aws-lambdasono obsoleti. Amazon spedisce i tipi di dattiloscritto con l' SDK ufficiale . Non è necessario DefinitelyTyped.
Sandro Keil,

Ciò ha risolto l'errore esatto definito nella domanda per me e stavo solo importando rxjs, nemmeno usando Promis. Grazie mille!
muzurB,

3
Questa è probabilmente la risposta migliore per coloro che stavano prendendo di mira es5 per cominciare. Anche il passaggio da es5 a es2015 ha risolto questo problema anche per me. Tieni comunque presente che probabilmente vedrai l'errore fino allo spegnimento e al riavvio dell'IDE / editor. Qualcosa sul TSC (o sulla sua modalità watch) stava facendo sembrare che questo non lo stava risolvendo quando era davvero, ma richiedeva un riavvio di vscode.

7
aggiornamento / addendum: se vuoi ancora scegliere come target es5 (per un migliore supporto del browser ed è importante) che funziona ancora fintanto che lo fornisci nelle opzioni del tuo compilatore: "lib": ["es2015", "dom", " ScriptHost "], il trucco per me era rendermi conto che dovevo riavviare l'editor VSCode, prima che iniziasse a funzionare dopo aver apportato quella modifica.

83

Incontra lo stesso errore oggi e risolto con:

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

Aggiornare:

Inserisci:

import {Promise} from 'es6-promise'

3
+ e il riavvio di VS Code aiuta anche, dopo l'installazione dei tipi
Legends

4
Erratum: funziona usando questa linea import {Promise} from 'es6-promise';
Loic Coenen,

dove aggiungere "import {Promise} da 'es6-promise'"?
bArraxas,

Ho usato questa soluzione in passato, ma al momento non funziona per me. import { Promise } from '../node_modules/es6-promise/es6-promise';, tuttavia, sembra funzionare bene. Perché TS non sarebbe in grado di trovare le tipizzazioni installate?
ringhio

35

Ho risolto questo aggiungendo il codice seguente al file tsconfig.json.

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

3
questo ha funzionato per me, ma nota che l'array "lib" deve trovarsi all'interno dell'oggetto "compilerOptions" nel file tsconfig.json.
BillyRayCyrus,

5
Usando TypeScript 2.4.1 ho dovuto cambiare tutti i caratteri dell'array di stringhe in minuscolo. Quindi ha funzionato. Grazie molto.
JDTLH9,

18

Risolto modificando il target 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
}
}

11

Ecco il mio consiglio Testato con vscode 1.21.1 (su MAC)

Inserisci sotto config su tsconfig.json

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

in compilerOptions

Riavvia IDE (questa azione è richiesta: D)


3
Questo è elencato in molte delle risposte qui ed è importante : "Riavvia IDE (questa azione è richiesta)"
atconway

7

Ho avuto questo errore ma l'ho risolto usando questo comando, il mio nome di file ts è promises-fs.ts:

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

e l'errore è sparito


5

Aggiungi sotto la riga al file in cui viene generato l'errore. Ciò dovrebbe risolvere il problema

declare var Promise: any;

PS: Questa non è sicuramente la soluzione ottimale


18
Questo è semplicemente rimuovere il controllo del tipo per "Promessa", piuttosto che ripararlo in modo che Typescript trovi il tipo corretto.
edibleEnergy

1
Questa soluzione alternativa, ad esempio, non funziona con Internet Explorer 11. Viene visualizzato un errore "non definito" quando si tenta di utilizzare Promise. Comunque con Chrome la soluzione alternativa fa il suo lavoro.
Calin Vlasin,

1
è un'uscita da codardo. Perché usare il TSse hai intenzione di fare qualcosa del genere. Voglio dire qual è il punto allora ?!
Hafiz Temuri,

1
Concordo sul fatto che ciò non è ottimale, ma non è giusto affermare che questa dichiarazione significhi che non ha senso utilizzare TS. Rilasciare il typecheck su un tipo non rende inutile il resto dei typecheck. E per me, questa è stata l'unica soluzione che ha funzionato.
Thorkil Værge,

Potrebbe essere un trucco sporco, ma è l'unica cosa che ha funzionato per me dopo aver provato tutte le altre soluzioni in questa pagina. Almeno ho ottenuto il mio codice compilato e funzionante. Scavo hack sporchi che funzionano.
Jeremy Thille,

4

Alla fine tsc ha iniziato a funzionare senza errori. Ma più modifiche. Grazie a Sandro Keil , a punta e sindacale

  • Rimosso dt ~ aws-lambda
  • Opzioni rimosse come noEmit, dichiarazione
  • Gruntfile modificato e rimosso 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

Aveva lo stesso problema con dattiloscritto e il aws-sdk. La soluzione era cambiare l'obiettivo in es6.

Il mio tsconfig.jsonfile completo :

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

3
Sì, il trucchetto es6 dovrebbe risolverlo, ma allora hai meno compatibilità del browser. La maggior parte delle app è ancora indirizzata a es5, perché molti browser non sono ancora su es6 (a partire dal 2017)

@ user2080225 anche se questo è vero, non rende la mia risposta meno corretta poiché la domanda originale non affermava nulla sulla compatibilità del browser. Pertanto questa soluzione potrebbe ancora aiutare gli altri come mi ha aiutato.
Fanus du Toit,

3

Ho avuto lo stesso problema fino a quando non ho aggiunto il seguente array lib in 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

Bene, questo potrebbe essere contro-intuitivo, ma ho risolto questo aggiungendo esnextal mio lib.

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

Il FIX, come suggerito dal compilatore, è

Prova a cambiare l' libopzione del compilatore in es2015 o successive.


1

Core-js non ha funzionato per me poiché ha causato altri problemi, semplicemente installando l'ultima versione di npm i @types/es6-promise --save-devliberarsi dei problemi. I problemi per me derivavano dalla compilazione di un SDK che utilizzava rxjs. Ecco l'errore che stavo ottenendo:

`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

Se stai usando il repository DefinitelyTyped nel tuo progetto potresti riscontrare questo recente problema .

Una soluzione decente che potresti usare (oltre ad attendere una build aggiornata del file delle definizioni o il refactoring del tuo codice TS) è quella di specificare una versione esplicita + build per le tipizzazioni core-js piuttosto che lasciare che Visual Studio scelga l'ultima / la più recente . Ne ho trovato uno che sembra non essere interessato da questo problema (almeno nel mio caso), puoi usarlo sostituendo la seguente riga dal tuo file package.jso n:

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

Con il seguente:

  "scripts": {
    "postinstall": "typings install dt~core-js@0.9.7+20161130133742 --global"
  }

Ciò ha risolto il mio problema per sempre. Tuttavia, si consiglia vivamente di rimuovere il riferimento esplicito versione + build non appena il problema verrà rilasciato.

Per ulteriori informazioni su questo problema, puoi anche leggere questo post sul blog che ho scritto sull'argomento.


0

Ho avuto lo stesso problema e questo mi ha salvato dal problema in secondo luogo:

scrivi in ​​console questo:

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

nel file in cui è presente il problema copia incolla questo:

import * as Promise from 'bluebird';

0

Basta cambiare la destinazione in "ES2017" nel file tsconfig.json.

questo è il mio file 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

dopo il comando up, faresti meglio a controllare tsconfig.json assicurandoti che "target" sia ottimo di "es6". forse tsc non supporta ancora es5.


0

Nessuna delle risposte più votate qui funziona per me. Ecco una soluzione garantita e ragionevole. Metti questo nella parte superiore di qualsiasi file di codice che utilizza Promise ...

declare const Promise: any;

2
No, non farlo ... o semplicemente non usare il dattiloscritto se hai intenzione di fare qualcosa del genere
Hafiz Temuri

0

Avendo trascorso molto tempo a cercare di risolvere questo problema. Non ho avuto fortuna con qualsiasi soluzione fornita qui o altrove.

Ma poi ho capito che non si trattava solo di risolvere il problema. Ma devi anche riavviare VSCODE affinché abbia effetto.


0

Ho avuto lo stesso errore e l'ho risolto con questa configurazione:

File: tsconfig.json

{
  "compilerOptions": {
    "target": "es2015",                      
    "module": "commonjs",                    
    "strict": true,                          
    "esModuleInterop": true                  
  }
}

0

Si noti che se si esegue il comando tsc con un nome file, ad esempio:

tsc testfile.ts

quindi il file di configurazione del compilatore tsconfig.json viene ignorato. La soluzione consiste nell'eseguire da solo il comando tsc, nel qual caso verranno compilati tutti i file .ts nella directory, a meno che non sia stato modificato tsconfig.json per includere un set di file.

vedere "utilizzo della proprietà dei file" ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html


0

Lo stesso errore qui. Ho risolto questo problema usando "module": "ES6" in tsconfig.


0

Mi sono sbarazzato di questo stesso errore index.tscon queste proprietà combinate:

In tsconfig.json:

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

E in package.json:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.