typescript: error TS2693: „Promise” odnosi się tylko do typu, ale jest tutaj używana jako wartość

144

Próbuję użyć Typescript dla mojej AWS Lambda i otrzymuję następujące błędy, gdy używam obietnic.

błąd TS2693: „Promise” odnosi się tylko do typu, ale jest tutaj używana jako wartość.

Próbowałem użyć następujących odmian kodu

Korzystanie z konstruktora Promise

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

przy użyciu Promise.reject

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

Wersje

Poniżej znajdują się wersje w moich zależnościach od deweloperów:

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

Zawartość pliku 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"
    ]
}

Używam grunt-ts z następującą konfiguracją do uruchamiania zadania ts.

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

Próbowałem z rozwiązaniem wymienionym w Otrzymuję: [ts] „Obietnica” odnosi się tylko do typu, ale jest tutaj używana jako wartość, ale bez powodzenia.

kalyanvgopal
źródło
1
Funkcja wywołania zwrotnego przekazywana do konstruktora Promise nie wymaga zwracania wartości. Po prostu się go pozbądź return.
Pointy
Masz na myśli coś takiego? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Próbowałem tego. Ale to nie rozwiązało problemu.
kalyanvgopal
Tak. JavaScript nie dba o to, czy zwrócisz wartość, czy nie, ale nie zwróci na to uwagi. Jednak TypeScript to obchodzi.
Pointy
Rozumiem. Ale dlaczego tsc nie kompiluje żadnego smaku Promose.resolve lub Promise.reject?
kalyanvgopal
Tego nie wiem. Jak dokładnie jest responsePromisedeklarowane?
Pointy

Odpowiedzi:

122

Miałem ten sam problem z aws-sdki rozwiązałem go za pomocą "target": "es2015". To jest moja tsconfig.jsonteczka.

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": false,
        "noImplicitAny": false,
        "module": "commonjs",
        "target": "es2015"
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}
Sandro Keil
źródło
5
Dzięki Sandro. Próbowałem to samo, ale nie pomogło w moim przypadku.
kalyanvgopal
Może @types/aws-lambdasą nieaktualne. Amazon dostarcza typy Typescript z oficjalnym SDK . Nie ma potrzeby korzystania z DefinitelyTyped.
Sandro Keil
To rozwiązało dokładny błąd zdefiniowany w pytaniu dla mnie i właśnie importowałem rxjs, nawet nie używając Promis. Dzięki wielkie!
muzurB
3
To prawdopodobnie najlepsza odpowiedź dla tych, którzy na początku celowali w es5. Przejście z es5 na es2015 również naprawiło to dla mnie. Ostrzegamy jednak, że prawdopodobnie nadal będziesz widzieć błąd, dopóki nie wyłączysz i nie uruchomisz ponownie swojego IDE / edytora. Coś w TSC (lub jego trybie oglądania) sprawiało, że wyglądało na to, że to nie naprawiało go, kiedy tak naprawdę było, ale wymagało ponownego uruchomienia vscode.
7
aktualizacja / uzupełnienie: jeśli nadal chcesz kierować reklamy na es5 (dla lepszej obsługi przeglądarek i jest to ważne), to nadal działa, o ile podasz to w opcjach kompilatora: "lib": ["es2015", "dom", " ScriptHost "], Sztuczka polegała na tym, że zdałem sobie sprawę, że muszę ponownie uruchomić edytor VSCode, zanim zacznie on działać po wprowadzeniu tej zmiany.
83

Spotkaj się dziś z tym samym błędem i rozwiąż go za pomocą:

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

Aktualizacja:

Dodaj:

import {Promise} from 'es6-promise'
Kenshin
źródło
3
+ i ponowne uruchomienie VS Code również pomaga, po zainstalowaniu typów
Legends,
4
Erratum: Działa przy użyciu tej linii import {Promise} from 'es6-promise';
Loic Coenen
gdzie dodać „import {Promise} from 'es6-promise'”?
bArraxas
Korzystałem z tego rozwiązania w przeszłości, ale w tej chwili nie działa. import { Promise } from '../node_modules/es6-promise/es6-promise';wydaje się jednak, że działa dobrze. Dlaczego TS nie może znaleźć zainstalowanych typów?
wskocz
35

Rozwiązałem to dodając poniższy kod do pliku tsconfig.json.

"lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"]
Nilesh
źródło
3
to zadziałało dla mnie, ale zauważ, że tablica „lib” musi znajdować się wewnątrz obiektu „compilerOptions” w pliku tsconfig.json.
BillyRayCyrus
5
Używając TypeScript 2.4.1 musiałem zmienić wszystkie znaki w tablicy ciągów na małe litery. Wtedy zadziałało. Wielkie dzięki.
JDTLH9
18

Rozwiązany przez zmianę celu w 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
źródło
11

Oto moja wskazówka. Testowane z Vscode 1.21.1 (na MAC)

Umieść poniżej config do tsconfig.json

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

do opcji compilerOptions

Zrestartuj IDE (ta akcja jest wymagana: D)

Nhan Cao
źródło
3
Jest to wymienione w wielu odpowiedziach tutaj i jest to na pewno ważne : „Uruchom ponownie IDE (ta akcja jest wymagana)”
atconway
7

Miałem ten błąd, ale rozwiązałem go za pomocą tego polecenia, nazwa mojego pliku ts to promises-fs.ts:

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

i błąd zniknął

Hazem HASAN
źródło
5

Dodaj poniższy wiersz do pliku, w którym zgłaszany jest błąd - to powinno rozwiązać problem

declare var Promise: any;

PS: To zdecydowanie nie jest optymalne rozwiązanie

Imamudin Naseem
źródło
18
Jest to po prostu usunięcie sprawdzania typu dla „Obietnicy” zamiast naprawiania go, tak aby Typescript znalazł właściwy typ.
jadalneEnergy
1
To obejście nie działa na przykład w przeglądarce Internet Explorer 11. Podczas próby użycia Promise generuje błąd „undefined”. W każdym razie w Chrome obejście robi swoje.
Calin Vlasin
1
to tchórzliwe wyjście. Po co używać, TSjeśli masz zamiar zrobić coś takiego. To znaczy po co ?!
Hafiz
1
Zgadzam się, że nie jest to optymalne, ale niesprawiedliwe jest twierdzenie, że ta deklaracja oznacza, że ​​nie ma sensu używać TS. Porzucenie sprawdzania typu na jednym typie nie powoduje, że reszta sprawdzeń typu jest bezużyteczna. Dla mnie było to jedyne rozwiązanie, które zadziałało.
Thorkil Værge
Może to być brudny hack, ale to jedyna rzecz, która zadziałała po wypróbowaniu wszystkich innych rozwiązań na tej stronie. Przynajmniej mam skompilowany i działający kod. Kopię brudne hacki, które działają.
Jeremy Thille
4

Wreszcie tsc zaczął działać bez żadnych błędów. Ale wiele zmian. Podziękowania dla Sandro Keil , Pointy & unional

  • Usunięto dt ~ aws-lambda
  • Usunięto opcje takie jak noEmit, deklaracja
  • Zmodyfikowano plik Gruntfile i usunięto 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"
                }
            },
...
kalyanvgopal
źródło
4

Miałem ten sam problem z maszynopisem i aws-sdk. Rozwiązaniem była zmiana celu na es6.

Mój kompletny tsconfig.jsonplik:

{
        compilerOptions: {
                outDir: ./dist/,
                sourceMap: true,
                noImplicitAny: true,
                module: commonjs,
                target: es6,
                jsx: react,
                allowJs: true
        },
        include: [
                ./src/**/*
    ]
}
Fanus du Toit
źródło
3
Tak, tartgeting es6 powinien to naprawić, ale wtedy masz mniejszą kompatybilność przeglądarki. Większość aplikacji nadal koncentruje się na es5, ponieważ wiele przeglądarek nie jest jeszcze na ES6 (stan na 2017 r.)
@ user2080225, chociaż to prawda, nie oznacza to, że moja odpowiedź jest mniej poprawna, ponieważ pierwotne pytanie nie zawierało nic na temat zgodności przeglądarki. Dlatego to rozwiązanie nadal może pomóc innym, takim jak mi.
Fanus du Toit
3

Miałem ten sam problem, dopóki nie dodałem następującej tablicy lib w 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"]
}
Jon Gear
źródło
2

Cóż, może to być sprzeczne z intuicją, ale rozwiązałem to, dodając esnextdo mojego lib.

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

FIX, zgodnie z sugestią kompilatora, ma

Spróbuj zmienić libopcję kompilatora na es2015 lub nowszą.

Salathiel Genèse
źródło
1

Core-js nie działał u mnie, ponieważ powodował inne problemy, jednak po prostu zainstalowanie najnowszej wersji npm i @types/es6-promise --save-devpozbyło się problemów. Problemy wynikały z kompilacji zestawu SDK korzystającego z rxjs. Oto błąd, który otrzymałem:

`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
źródło
1

Jeśli korzystasz z repozytorium DefinitelyTyped w swoim projekcie, możesz napotkać ten ostatni problem .

Przyzwoitym obejściem, którego możesz użyć (innym niż czekanie na zaktualizowaną kompilację pliku definicji lub refaktoryzację kodu TS), jest określenie jawnej wersji + kompilacja dla typów core-js, zamiast pozwolić programowi Visual Studio wybrać najnowszą / najnowszą . Znalazłem taki, który wydaje się być nienaruszony przez ten problem (przynajmniej w moim przypadku), możesz go użyć, zastępując następujący wiersz z pliku package.jso n:

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

Z następującym:

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

To rozwiązało mój problem na dobre. Jednak zdecydowanie zaleca się usunięcie jawnej wersji + odniesienia do kompilacji, gdy tylko problem zostanie opublikowany.

Aby uzyskać więcej informacji na ten temat, możesz również przeczytać ten wpis na blogu, który napisałem na ten temat.

Darkseal
źródło
0

Miałem ten sam problem i to uratowało mnie od problemu w drugiej:

napisz w konsoli to:

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

w pliku, w którym występuje problem, wklej to:

import * as Promise from 'bluebird';
Zack Zilic
źródło
0

Po prostu zmień cel na „ES2017” w pliku tsconfig.json.

to jest mój plik 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"
  ]
}
Camilo Soto
źródło
0

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

po poleceniu up, lepiej sprawdź tsconfig.json i upewnij się, że „cel” musi być świetny niż „es6”. może tsc nie obsługuje jeszcze es5.

Mostone
źródło
0

Żadna z udzielonych tutaj odpowiedzi nie działa dla mnie. Oto gwarantowane i rozsądne rozwiązanie. Umieść to u góry dowolnego pliku kodu używającego Promise ...

declare const Promise: any;
user1618323
źródło
2
Nie, nie rób tego ... lub po prostu nie używaj maszynopisu, jeśli masz zamiar zrobić coś takiego
Hafiz Temuri
0

Spędziłem dużo czasu, próbując to naprawić. Nie miałem szczęścia w żadnym rozwiązaniu, które zapewniłem tutaj lub gdzie indziej.

Ale potem zdałem sobie sprawę, że to nie tylko rozwiązanie problemu. Ale musisz również PONOWNIE URUCHOMIĆ VSCODE, aby zadziałało.

ravish.hacker
źródło
0

Miałem ten sam błąd i naprawiłem go w tej konfiguracji:

Plik: tsconfig.json

{
  "compilerOptions": {
    "target": "es2015",                      
    "module": "commonjs",                    
    "strict": true,                          
    "esModuleInterop": true                  
  }
}
Jonathan Mendoza
źródło
0

Pamiętaj, że jeśli uruchamiasz polecenie tsc z nazwą pliku, tj .:

tsc testfile.ts

wówczas plik konfiguracyjny kompilatora tsconfig.json jest ignorowany. Rozwiązaniem jest uruchomienie albo samego polecenia tsc, w którym to przypadku wszystkie pliki .ts w katalogu zostaną skompilowane, chyba że zmodyfikowano plik tsconfig.json, aby zawierał zestaw plików.

zobacz „using the files property” ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

młynarz goryl
źródło
0

Ten sam błąd tutaj. Naprawiłem to, używając "module": "ES6" w tsconfig.

Kamil Naja
źródło
0

Pozbyłem się tego samego błędu w index.tstych połączonych właściwościach:

W tsconfig.json:

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

A w pliku package.json:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
Washington Guedes
źródło