typescript: error TS2693: 'Janji' hanya merujuk pada tipe, tetapi digunakan sebagai nilai di sini

144

Saya mencoba menggunakan Script untuk AWS Lambda saya dan saya mendapatkan kesalahan berikut di mana pun saya menggunakan janji.

kesalahan TS2693: 'Janji' hanya merujuk pada tipe, tetapi digunakan sebagai nilai di sini.

Saya mencoba menggunakan variasi kode berikut

Menggunakan konstruktor Janji

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

menggunakan Promise.reject

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

Versi

Berikut ini adalah versi dalam dependensi dev saya:

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

Isi dari 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"
    ]
}

Saya menggunakan grunt-ts dengan konfigurasi berikut untuk menjalankan tugas ts.

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

Saya mencoba dengan solusi yang disebutkan dalam saya dapatkan: [ts] 'Janji' hanya mengacu pada tipe, tetapi sedang digunakan sebagai nilai di sini tetapi tidak berhasil.

kalyanvgopal
sumber
1
Tidak diperlukan nilai balik untuk fungsi panggilan balik yang diteruskan ke konstruktor Janji. Singkirkan saja return.
Pointy
Apakah maksud Anda seperti ini? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Saya mencobanya. Tapi itu tidak masalah dengan masalah itu.
kalyanvgopal
Iya. JavaScript tidak peduli apakah Anda mengembalikan nilai atau tidak, tetapi tidak akan memperhatikannya. TypeScript, bagaimanapun, tidak peduli.
Pointy
Mengerti. Tapi mengapa tsc gagal untuk mengkompilasi rasa Promose.resolve atau Promise.reject?
kalyanvgopal
Saya tidak tahu itu. Bagaimana tepatnya responsePromisedinyatakan?
Pointy

Jawaban:

122

Saya memiliki masalah yang sama dengan aws-sdkdan saya menyelesaikannya dengan menggunakan "target": "es2015". Ini tsconfig.jsonfile saya .

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": false,
        "noImplicitAny": false,
        "module": "commonjs",
        "target": "es2015"
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}
Sandro Keil
sumber
5
Terima kasih Sandro. Mencoba yang sama tetapi tidak membantu dalam kasus saya.
kalyanvgopal
Mungkin @types/aws-lambdasudah ketinggalan zaman. Amazon mengirimkan jenis-jenis naskah dengan SDK resmi . Tidak perlu untuk DefinitelyTyped.
Sandro Keil
Itu memecahkan kesalahan tepat yang didefinisikan dalam pertanyaan untuk saya dan saya hanya mengimpor rxjs, bahkan tidak menggunakan Promis. Terima kasih banyak!
muzurB
3
Ini mungkin jawaban terbaik bagi mereka yang menargetkan es5 untuk memulai. Beralih dari es5 ke es2015 juga memperbaiki ini untuk saya. Namun berhati-hatilah, Anda kemungkinan masih akan melihat kesalahan sampai Anda mematikan dan memulai kembali IDE / editor Anda. Sesuatu tentang TSC (atau mode arlojinya) membuatnya tampak bahwa ini tidak memperbaikinya ketika itu benar-benar terjadi, tetapi membutuhkan restart vscode.
7
update / addendum: jika Anda ingin tetap menargetkan es5 (untuk dukungan browser yang lebih baik, dan penting) yang masih berfungsi selama Anda memberikan ini dalam opsi kompiler Anda: "lib": ["es2015", "dom", " ScriptHost "], Trik untuk saya adalah menyadari bahwa saya harus me-restart editor VSCode, sebelum mulai bekerja setelah melakukan perubahan itu.
83

Hadapi kesalahan yang sama hari ini dan atasi dengan:

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

Memperbarui:

Menambahkan:

import {Promise} from 'es6-promise'
Kenshin
sumber
3
+ dan memulai ulang VS Code juga membantu, setelah pemasangan tipe
Legends
4
Erratum: Berhasil menggunakan baris ini import {Promise} from 'es6-promise';
Loic Coenen
tempat menambahkan "impor {Promise} dari 'es6-janji'"?
bArraxas
Saya telah menggunakan solusi ini di masa lalu, tetapi saat ini tidak berfungsi untuk saya. import { Promise } from '../node_modules/es6-promise/es6-promise';Namun, tampaknya berfungsi dengan baik. Mengapa TS tidak dapat menemukan pengetikan yang diinstal?
snarf
35

Saya memecahkan ini dengan menambahkan kode di bawah ini ke file tsconfig.json.

"lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"]
Nilesh
sumber
3
ini bekerja untuk saya, tetapi perhatikan bahwa "lib" array harus berada di dalam objek "compilerOptions" di file tsconfig.json.
BillyRayCyrus
5
Menggunakan TypeScript 2.4.1 saya harus mengubah semua karakter dalam array string menjadi huruf kecil. Lalu berhasil. Terimakasih banyak.
JDTLH9
18

Dipecahkan dengan mengubah target dalam 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
sumber
11

Ini tip saya. Diuji dengan vscode 1.21.1 (di MAC)

Letakkan di bawah config ke tsconfig.json

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

ke dalam compilerOptions

Restart IDE (tindakan ini diperlukan: D)

Nhan Cao
sumber
3
Ini tercantum dalam beberapa jawaban di sini dan penting untuk memastikan: "Restart IDE (tindakan ini diperlukan)"
atconway
7

Saya memiliki kesalahan ini tetapi saya menyelesaikannya dengan menggunakan perintah ini, nama file ts saya adalah menjanjikan-fs.ts:

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

dan kesalahan hilang

Hazem HASAN
sumber
5

Tambahkan baris di bawah ini ke file di mana kesalahan terjadi. Ini harus memperbaiki masalah

declare var Promise: any;

PS: Ini jelas bukan solusi yang optimal

Imamudin Naseem
sumber
18
Ini hanya menghapus cek jenis untuk 'Janji,' alih-alih memperbaikinya sehingga Typcript menemukan jenis yang benar.
edibleEnergy
1
Solusi ini tidak berfungsi dengan Internet Explorer 11 misalnya. Saya melempar kesalahan 'tidak terdefinisi' ketika mencoba menggunakan Janji. Pokoknya dengan Chrome solusinya melakukan tugasnya.
Calin Vlasin
1
itu jalan keluar pengecut. Mengapa menggunakan TSjika Anda akan melakukan sesuatu seperti ini. Maksudku, apa gunanya ?!
Hafiz Temuri
1
Saya setuju bahwa ini tidak optimal tetapi tidak adil untuk mengatakan bahwa pernyataan ini berarti bahwa tidak ada gunanya menggunakan TS. Menjatuhkan typecheck pada satu jenis tidak membuat sisa dari typecheck tidak berguna. Dan bagi saya, ini adalah satu-satunya solusi yang berhasil.
Thorkil Værge
Mungkin peretasan yang kotor, tetapi itu satu-satunya yang bekerja untuk saya setelah saya mencoba semua solusi lain di halaman ini. Setidaknya saya mendapatkan kode saya dikompilasi dan berfungsi. Saya menggali hack kotor yang berhasil.
Jeremy Thille
4

Akhirnya tsc mulai bekerja tanpa kesalahan. Tetapi banyak perubahan. Berkat Sandro Keil , runcing & unional

  • Dihapus dt ~ aws-lambda
  • Opsi yang dihapus seperti noEmit, deklarasi
  • Modifikasi Gruntfile dan penghapusan Abaikan

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

Punya masalah yang sama dengan naskah dan aws-sdk. Pemecahannya adalah mengubah target menjadi es6.

tsconfig.jsonFile lengkap saya :

{
        compilerOptions: {
                outDir: ./dist/,
                sourceMap: true,
                noImplicitAny: true,
                module: commonjs,
                target: es6,
                jsx: react,
                allowJs: true
        },
        include: [
                ./src/**/*
    ]
}
Fanus du Toit
sumber
3
Ya, tartgeting es6 harus memperbaikinya, tetapi Anda memiliki lebih sedikit kompatibilitas browser. Sebagian besar aplikasi masih menargetkan es5 hari ini, karena banyak browser masih belum menggunakan es6 (pada 2017)
@ user2080225 meskipun itu benar, itu tidak membuat jawaban saya kurang benar karena pertanyaan aslinya tidak menyatakan apa pun tentang kompatibilitas browser. Karena itu solusi ini masih bisa membantu orang lain seperti itu membantu saya.
Fanus du Toit
3

Saya memiliki masalah yang sama sampai saya menambahkan lib array berikut di 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
sumber
2

Yah, ini mungkin kontra-intuitif tetapi saya menyelesaikan ini menambahkan esnextke saya lib.

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

FIX, seperti yang disarankan oleh kompiler adalah untuk

Coba ubah libopsi kompiler ke es2015 atau yang lebih baru.

Salathiel Genèse
sumber
1

Core-js tidak bekerja untuk saya karena menyebabkan masalah lain, namun, hanya menginstal versi terbaru dari npm i @types/es6-promise --save-devmenyingkirkan masalah tersebut. Masalah bagi saya berasal dari kompilasi SDK yang menggunakan rxjs. Inilah kesalahan yang saya dapatkan:

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

Jika Anda menggunakan repositori DefinitelyTyped di proyek Anda, Anda mungkin mengalami masalah baru-baru ini .

Solusi yang layak yang mungkin Anda gunakan (selain menunggu build yang diperbarui dari file definisi atau refactoring kode TS Anda) adalah untuk menentukan versi eksplisit + build untuk core-js typing daripada membiarkan Visual Studio memilih yang terbaru / terbaru . Saya menemukan satu yang tampaknya tidak terpengaruh oleh masalah ini (setidaknya dalam kasus saya), Anda dapat menggunakannya untuk mengganti baris berikut dari file package.jso n Anda:

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

Dengan yang berikut ini:

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

Ini memperbaiki masalah saya untuk selamanya. Namun, sangat disarankan untuk menghapus versi eksplisit + referensi pembangunan segera setelah masalah ini dirilis.

Untuk info lebih lanjut tentang masalah ini, Anda juga dapat membaca posting blog yang saya tulis pada topik ini.

Darkseal
sumber
0

Saya memiliki masalah yang sama dan ini menyelamatkan saya dari masalah di detik:

tulis di konsol ini:

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

dalam file di mana masalahnya adalah salin tempel ini:

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

Ubah saja target menjadi "ES2017" dalam file tsconfig.json.

ini adalah file tsconfig.json saya

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

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

setelah perintah, Anda sebaiknya memeriksa tsconfig.json memastikan "target" harus lebih dari "es6". mungkin tsc belum mendukung es5.

Kebanyakan orang
sumber
0

Tidak ada jawaban yang dipilih di sini yang berfungsi untuk saya. Berikut ini adalah solusi yang dijamin dan masuk akal. Letakkan ini di dekat bagian atas file kode apa pun yang menggunakan Janji ...

declare const Promise: any;
pengguna1618323
sumber
2
Tidak, jangan lakukan ini ... atau jangan gunakan skrip jika Anda akan melakukan sesuatu seperti ini
Hafiz Temuri
0

Setelah menghabiskan banyak waktu mencoba untuk memperbaikinya. Saya tidak beruntung dengan solusi yang diberikan di sini atau di tempat lain.

Tetapi kemudian menyadari bahwa itu bukan hanya sekedar menyelesaikan masalah. Tetapi Anda juga perlu MEMULAI kembali VSCODE agar dapat memengaruhi.

ravish.hacker
sumber
0

Saya memiliki kesalahan yang sama dan saya memperbaikinya dengan konfigurasi ini:

File: tsconfig.json

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

Perlu diketahui bahwa jika Anda menjalankan perintah tsc dengan nama file yaitu:

tsc testfile.ts

maka file konfigurasi compiler tsconfig.json diabaikan. Solusinya adalah dengan menjalankan perintah tsc sendiri, dalam hal ini semua file .ts di direktori akan dikompilasi, kecuali Anda telah mengedit tsconfig.json untuk memasukkan sekumpulan file.

lihat 'menggunakan properti file' ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

menggiling gorila
sumber
0

Kesalahan yang sama di sini. Saya memperbaikinya, menggunakan "modul": "ES6" di tsconfig.

Kamil Naja
sumber
0

Saya menyingkirkan kesalahan yang sama index.tsdengan properti gabungan ini:

Di tsconfig.json:

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

Dan di package.json:

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