Tại sao nó không hoạt động
import * as MC from './MyClass';
Đây là importcú 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ừ ./MyClassvà 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 importsử dụng * as Xtừ 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 defaultthay 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 namespacekhai báo vào MyClasslà 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 defaultxuấ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 allowSyntheticDefaultImportslệnh hoặc tsconfig.jsontùy chọn.
Lưu ý rằng điều đó allowSyntheticDefaultImportshoà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 defaultxuấ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.
javascriptlà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.