Tại sao nó không hoạt động
import * as MC from './MyClass';
Đây là import
cú pháp kiểu ES6 / ES2015 . Ý nghĩa chính xác của điều này là "Lấy đối tượng không gian tên mô-đun được tải từ ./MyClass
và sử dụng nó cục bộ như MC
". Đáng chú ý, " đối tượng không gian tên mô-đun " chỉ bao gồm một đối tượng thuần túy với các thuộc tính. Một đối tượng mô-đun ES6 không thể được gọi dưới dạng một hàm hoặc với new
.
Nói lại lần nữa: Một đối tượng không gian tên mô-đun ES6 không thể được gọi dưới dạng một hàm hoặc với new
.
Thứ bạn import
sử dụng * as X
từ một mô-đun được xác định là chỉ có thuộc tính. Trong CommonJS cấp thấp, điều này có thể không được tôn trọng đầy đủ, nhưng TypeScript cho bạn biết hành vi được định nghĩa bởi tiêu chuẩn là gì.
Những gì hoạt động?
Bạn sẽ cần sử dụng cú pháp nhập kiểu CommonJS để sử dụng mô-đun này:
import MC = require('./MyClass');
Nếu bạn kiểm soát cả hai mô-đun, bạn có thể sử dụng export default
thay thế:
MyClass.ts
export default class MyClass {
constructor() {
}
}
MyConsumer.ts
import MC from './MyClass';
Tôi Buồn Về Điều Này; Quy tắc là Dumb.
Sẽ rất tuyệt nếu sử dụng cú pháp nhập ES6, nhưng bây giờ tôi phải làm điều này import MC = require('./MyClass');
? Đó là năm 2013! Què! Nhưng đau buồn là một phần bình thường của lập trình. Hãy chuyển sang giai đoạn năm trong mô hình Kübler-Ross: Chấp nhận.
TypeScript ở đây cho bạn biết điều này không hoạt động, bởi vì nó không hoạt động. Có những bản hack (thêm namespace
khai báo vào MyClass
là một cách phổ biến để giả vờ điều này hoạt động) và chúng có thể hoạt động ngày nay trong gói mô-đun cấp thấp cụ thể của bạn (ví dụ: cuộn lên), nhưng điều này là viển vông. Chưa có bất kỳ triển khai mô-đun ES6 nào trong tự nhiên, nhưng điều đó sẽ không đúng mãi mãi.
Hình dung bản thân trong tương lai của bạn, cố gắng chạy trên triển khai mô-đun ES6 gốc neato và nhận thấy rằng bạn đã tự thiết lập cho mình một thất bại lớn bằng cách cố gắng sử dụng cú pháp ES6 để làm điều gì đó mà ES6 rõ ràng không làm .
Tôi muốn tận dụng bộ tải mô-đun không chuẩn của mình
Có thể bạn có một trình tải mô-đun "hữu ích" tạo default
xuất khi không có. Ý tôi là, mọi người đưa ra các tiêu chuẩn là có lý do, nhưng việc bỏ qua các tiêu chuẩn đôi khi rất thú vị và chúng ta có thể nghĩ đó là một điều tuyệt vời nên làm.
Thay đổi MyConsumer.ts thành:
import A from './a';
Và chỉ định dòng allowSyntheticDefaultImports
lệnh hoặc tsconfig.json
tùy chọn.
Lưu ý rằng điều đó allowSyntheticDefaultImports
hoàn toàn không thay đổi hành vi thời gian chạy của mã của bạn. Nó chỉ là một lá cờ cho TypeScript biết rằng trình nạp mô-đun của bạn tạo ra các bản default
xuất khi không có. Nó sẽ không làm cho mã của bạn hoạt động trong nodejs một cách kỳ diệu như trước đây.
javascript
làm thẻ chính và bỏ điecmascript-6
, bởi vì thẻ chính ở đây làtypescript
. Câu hỏi giả định sai rằngexport =
(một tính năng TS) có thể được ghép nối vớiimport ... from
, trong khi nó phải được ghép nối vớiimport =
. Về cơ bản nó là nhập / xuất mô-đun ES6 so với CJS / AMD.