Naskah: Tidak dapat menggunakan pernyataan impor di luar modul

19

Saya memiliki file .ts di node js (versi terbaru dari node.js untuk 07.10.19) aplikasi dengan mengimpor node-module tanpa ekspor default. Saya menggunakan konstruksi ini: import { Class } from 'abc';Ketika saya menjalankan kode, saya memiliki kesalahan ini: Cannot use import statement outside a module.

Dalam jaringan saya melihat banyak solusi untuk masalah ini (untuk .js), tetapi tidak membantu saya, mungkin karena saya punya file naskah. Ini kode saya:

import { Class } from 'abc';
module.exports = { ...
    execute(a : Class ,args : Array<string>){ ...

Inilah tsconfig.json saya:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",

    "strict": true
  }
}
Zerumi
sumber
Apakah Anda menjalankan ini di browser? Apakah importpernyataan itu baris pertama dalam file Anda?
Malam
1
Bisakah Anda memposting file tsconfig.json Anda? Ketika Anda mengkompilasi dalam naskah, Anda dapat menentukan jenis modul yang diproduksi, dan jenis yang valid mungkin berbeda tergantung pada lingkungan mana (browser / NodeJS) dan modul lain ( requirevs import) yang Anda gunakan. Hanya untuk memberi tahu Anda betapa rumitnya ini, Node memiliki beberapa dokumentasi tentang importvs requiredan bagaimana membuatnya bekerja bersama.
Jeff Bowman
1
Jika Anda menggunakan module.exportssintaks, Anda mungkin tidak berada dalam modul ES6.
Bergi
Evert, ini adalah aplikasi node js, tsconfig akan segera ditambahkan
Zerumi
Oke, saya tidak bisa menggunakan execute(a : abc.Class...
wajib

Jawaban:

5

Menambahkan “type”: “module”ke package.json akan memberi tahu Node bahwa Anda menggunakan modul ES2015, yang seharusnya menghilangkan kesalahan tersebut, tetapi kemudian Anda harus memberi tahu Typescript untuk menghasilkan modul jenis ini dengan mengatur “module”: “es2015”alih-alih “commonjs”di tsconfig.json.

Namun ini menyebabkan masalah dengan kode saat ini karena meskipun Anda menggunakan import {}pernyataan ES6 Anda mengekspor menggunakan module.exports = {}sintaks commonJS , dan pemuat modul ES Node akan memiliki masalah dengan itu. Ada dua cara untuk menghadapinya:

  1. Simpan module.exportstetapi beri tahu Node untuk menafsirkan file ini sebagai commonJS dengan memberikannya ekstensi .cjs .
  2. Ubah pernyataan ekspor menjadi sintaksis ES2015: export function execute(…)..

Opsi pertama bisa agak rumit karena kompiler akan menampilkan file .js dan Anda harus mengubahnya ke .cjs setiap saat (sejauh yang saya tahu). Dengan opsi kedua Anda harus dapat menjalankan file dengan Node (termasuk flag --experimental-modules untuk versi <13.8).

Jika Anda benar-benar perlu menggunakan commonJS, mungkin lebih baik untuk menginstal definisi tipe untuk Node: @ types / node dan ubah impor ke format commonJS: require('abc')dan pertahankan pengaturan seperti apa adanya (meskipun Anda dapat menambahkan "ketik" : "Commonjs" ke package.json menjadi eksplisit).

Zwiers
sumber
1
memerlukan ('abc'). Kelas tidak dapat digunakan dalam definisi .ts (seperti: Kelas) ... Tentang ekstensi .cjs ... Jenis hanya dapat dalam file .ts ... ES2015 juga bukan pilihan saya karena saya menggunakan modul ini dengan impor lama (harus) di mana-mana ... Saya memecahkan masalah ini menggunakan JSDoc. Tapi terima kasih atas jawabannya
Zerumi