Mengapa tidak berhasil
import * as MC from './MyClass';
Ini adalah import
sintaks gaya ES6 / ES2015 . Arti sebenarnya dari ini adalah "Ambil objek ruang nama modul yang dimuat dari ./MyClass
dan gunakan secara lokal sebagai MC
". Khususnya, " objek ruang nama modul " hanya terdiri dari objek biasa dengan properti. Objek modul ES6 tidak dapat dipanggil sebagai fungsi atau dengan new
.
Untuk mengatakannya lagi: Objek namespace modul ES6 tidak dapat dipanggil sebagai fungsi atau dengan new
.
Hal yang Anda import
gunakan * as X
dari modul didefinisikan hanya memiliki properti. Dalam CommonJS downleveled ini mungkin tidak sepenuhnya dipatuhi, tetapi TypeScript memberi tahu Anda apa perilaku yang ditentukan oleh standar itu.
Apa yang berhasil?
Anda harus menggunakan sintaks impor gaya CommonJS untuk menggunakan modul ini:
import MC = require('./MyClass');
Jika Anda mengontrol kedua modul, Anda dapat menggunakan export default
:
MyClass.ts
export default class MyClass {
constructor() {
}
}
MyConsumer.ts
import MC from './MyClass';
Saya Sedih Tentang Ini; Aturannya Bodoh.
Alangkah baiknya menggunakan sintaks impor ES6, tetapi sekarang saya harus melakukan import MC = require('./MyClass');
hal ini ? Ini sangat 2013! Kuno! Tetapi kesedihan adalah bagian normal dari pemrograman. Silakan lompat ke tahap lima dalam model Kübler-Ross: Penerimaan.
TypeScript di sini memberi tahu Anda bahwa ini tidak berfungsi, karena tidak berfungsi. Ada peretasan (menambahkan namespace
deklarasi ke MyClass
adalah cara yang populer untuk menganggap ini berfungsi), dan mereka mungkin bekerja hari ini di bundler modul penurunan tingkat tertentu (misalnya rollup), tetapi ini ilusi. Belum ada implementasi modul ES6 di alam liar, tetapi itu tidak akan berlaku selamanya.
Bayangkan diri Anda di masa depan, mencoba menjalankan implementasi modul ES6 asli neato dan menemukan bahwa Anda telah menyiapkan diri Anda sendiri untuk kegagalan besar dengan mencoba menggunakan sintaks ES6 untuk melakukan sesuatu yang secara eksplisit tidak dilakukan ES6 .
Saya ingin memanfaatkan pemuat modul non-standar saya
Mungkin Anda memiliki pemuat modul yang "membantu" membuat default
ekspor jika tidak ada. Maksud saya, orang membuat standar karena suatu alasan, tetapi mengabaikan standar terkadang menyenangkan dan kami dapat berpikir itu hal yang keren untuk dilakukan.
Ubah MyConsumer.ts menjadi:
import A from './a';
Dan tentukan baris allowSyntheticDefaultImports
perintah atau tsconfig.json
opsi.
Perhatikan bahwa allowSyntheticDefaultImports
tidak mengubah perilaku waktu proses kode Anda sama sekali. Itu hanya sebuah bendera yang memberi tahu TypeScript bahwa pemuat modul Anda membuat default
ekspor ketika tidak ada. Ini tidak akan secara ajaib membuat kode Anda berfungsi di nodejs ketika sebelumnya tidak.
javascript
sebagai tag utama dan keluarecmascript-6
, karena tag utama di sini adalahtypescript
. Pertanyaannya salah mengasumsikan bahwaexport =
(fitur TS) dapat dipasangkanimport ... from
, sementara itu harus dipasangkanimport =
. Ini pada dasarnya adalah impor / ekspor modul ES6 vs CJS / AMD.