Bản thảo: Không thể sử dụng câu lệnh nhập bên ngoài mô-đun


19

Tôi có một tệp .ts trong ứng dụng nút js (phiên bản mới nhất của node.js cho 07.10.19) với việc nhập mô-đun nút mà không xuất mặc định. Tôi sử dụng cấu trúc này: import { Class } from 'abc';Khi tôi chạy mã, tôi gặp lỗi này : Cannot use import statement outside a module.

Trong mạng tôi thấy nhiều giải pháp cho vấn đề này (đối với .js), nhưng nó không giúp ích gì cho tôi, có lẽ vì tôi có tệp bản thảo. Đây là mã của tôi:

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

Đây là tsconfig.json của tôi:

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

    "strict": true
  }
}

Bạn đang chạy cái này trong một trình duyệt? Là importtuyên bố dòng đầu tiên trong tập tin của bạn?
Evert

1
Bạn có thể vui lòng gửi tập tin tsconfig.json không? Khi bạn biên dịch trong Bản mô tả, bạn có thể xác định loại mô-đun nào tạo ra và loại hợp lệ có thể khác nhau tùy thuộc vào môi trường nào (trình duyệt / NodeJS) và mô-đun nào khác ( requireso với import) bạn sử dụng. Chỉ để cho bạn biết mức độ phức tạp của nó, Node có một số tài liệu về importvs requirevà cách làm cho chúng hoạt động cùng nhau.
Jeff Bowman

1
Nếu bạn đang sử dụng module.exportscú pháp, có lẽ bạn không ở trong mô-đun ES6.
Bergi

Evert, đây là ứng dụng nút js, tsconfig sẽ sớm được thêm
Zerumi

Ok, tôi không thể sử dụng yêu cầu vì Không thể tìm thấy không gian tên 'abc' khi sử dụng xây dựngexecute(a : abc.Class...
Zerumi

Câu trả lời:


5

Việc thêm “type”: “module”vào gói.json sẽ cho Node biết bạn đang sử dụng các mô-đun ES2015, điều này sẽ loại bỏ lỗi, nhưng sau đó bạn sẽ cần báo cho typecript để tạo loại mô-đun này bằng cách đặt “module”: “es2015”thay vì “commonjs”trong tsconfig.json.

Tuy nhiên, điều này gây ra sự cố với mã hiện tại vì mặc dù bạn đang sử dụng import {}câu lệnh ES6 mà bạn đang xuất bằng module.exports = {}cú pháp commonJS và trình tải mô-đun ES của Node sẽ gặp vấn đề với nó. Có hai cách để đối phó với nó:

  1. Giữ module.exportsnhưng yêu cầu Node diễn giải tệp này là commonJS bằng cách cung cấp cho nó một phần mở rộng .cjs .
  2. Thay đổi câu lệnh xuất thành cú pháp ES2015: export function execute(…)..

Tùy chọn đầu tiên có thể hơi rắc rối vì trình biên dịch sẽ xuất các tệp .js và bạn phải thay đổi nó thành .cjs mọi lúc (theo như tôi biết). Với tùy chọn thứ hai, bạn sẽ có thể chạy tệp bằng Node (bao gồm cờ --experimental-mô-đun cho các phiên bản <13.8).

Nếu bạn thực sự cần sử dụng commonJS, có lẽ tốt hơn là cài đặt các định nghĩa loại cho Node: @ type / node và thay đổi nhập thành định dạng commonJS: require('abc')và giữ phần còn lại của cài đặt như vậy (mặc dù bạn có thể thêm loại Kiểu : Rõ ràng là chung chung với gói.json.


1
Yêu cầu ('abc'). Lớp không thể được sử dụng trong các định nghĩa .ts (như: Class) ... Giới thiệu về phần mở rộng .cjs ... Các loại chỉ có thể có trong tệp .ts ... ES2015 cũng không phải là lựa chọn của tôi vì tôi sử dụng mô-đun này với nhập khẩu cũ (yêu cầu) ở mọi nơi ... Tôi đã giải quyết vấn đề này bằng cách sử dụng JSDoc. Nhưng cảm ơn vì câu trả lời
Zerumi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.