ทำไมมันไม่ทำงาน
import * as MC from './MyClass';
นี่คือimportไวยากรณ์สไตล์ ES6 / ES2015 ความหมายที่แท้จริงของสิ่งนี้คือ "นำอ็อบเจ็กต์เนมสเปซโมดูลที่โหลดจาก./MyClassและใช้ในเครื่องเป็นMC" โดยเฉพาะอย่างยิ่ง "โมดูลเนมสเปซอ็อบเจ็กต์ " ประกอบด้วยอ็อบเจ็กต์ธรรมดาที่มีคุณสมบัติเท่านั้น ไม่สามารถเรียกใช้อ็อบเจ็กต์โมดูล ES6 เป็นฟังก์ชันหรือด้วยnew.
จะบอกว่ามันอีกครั้ง: ES6 โมดูล namespace newวัตถุไม่สามารถเรียกว่าเป็นฟังก์ชั่นหรือ
สิ่งที่คุณimportใช้* as Xจากโมดูลถูกกำหนดให้มีคุณสมบัติเท่านั้น ใน CommonJS ที่ลดระดับลงสิ่งนี้อาจไม่ได้รับการยอมรับอย่างสมบูรณ์ แต่ TypeScript กำลังบอกคุณว่าพฤติกรรมที่กำหนดโดยมาตรฐานคืออะไร
ทำงานอะไร?
คุณจะต้องใช้ไวยากรณ์การนำเข้าสไตล์ CommonJS เพื่อใช้โมดูลนี้:
import MC = require('./MyClass');
หากคุณควบคุมทั้งสองโมดูลคุณสามารถใช้export defaultแทน:
MyClass.ts
export default class MyClass {
constructor() {
}
}
MyConsumer.ts
import MC from './MyClass';
ฉันเศร้าเกี่ยวกับเรื่องนี้ กฎเป็นใบ้
คงจะดีถ้าใช้ไวยากรณ์การนำเข้า ES6 แต่ตอนนี้ฉันต้องทำimport MC = require('./MyClass');สิ่งนี้? เป็นปี 2013! กะพร่องกะแพร่ง! แต่ความเศร้าโศกเป็นเรื่องปกติของการเขียนโปรแกรม โปรดข้ามไปยังขั้นตอนที่ห้าในโมเดลKübler-Ross: การยอมรับ
TypeScript ที่นี่กำลังบอกคุณว่าสิ่งนี้ใช้ไม่ได้เพราะมันไม่ทำงาน มีแฮ็ก (การเพิ่มnamespaceคำประกาศMyClassเป็นวิธีที่นิยมในการแสร้งทำเป็นว่างานนี้) และอาจใช้ได้ผลในวันนี้ในชุดรวมโมดูลการลดระดับของคุณโดยเฉพาะ (เช่นการรวม) แต่นี่เป็นภาพลวงตา ยังไม่มีการติดตั้งโมดูล ES6 ใด ๆ ในป่า แต่จะไม่เป็นจริงตลอดไป
ภาพตัวเองในอนาคตของคุณพยายามที่จะใช้ในการดำเนินงาน Neato พื้นเมืองโมดูล ES6 และพบว่าคุณได้ตั้งตัวเองขึ้นสำหรับความล้มเหลวที่สำคัญโดยพยายามที่จะใช้ไวยากรณ์ ES6 จะทำสิ่งที่ ES6 อย่างชัดเจนไม่ได้ทำ
ฉันต้องการใช้ประโยชน์จากตัวโหลดโมดูลที่ไม่ได้มาตรฐานของฉัน
บางทีคุณอาจมีตัวโหลดโมดูลที่ "ช่วยได้" สร้างการdefaultส่งออกเมื่อไม่มีอยู่ ฉันหมายถึงคนสร้างมาตรฐานด้วยเหตุผล แต่การละเลยมาตรฐานเป็นเรื่องสนุกในบางครั้งและเราคิดว่านั่นเป็นสิ่งที่ดีที่ต้องทำ
เปลี่ยนMyConsumer.tsเป็น:
import A from './a';
และระบุallowSyntheticDefaultImportsบรรทัดคำสั่งหรือtsconfig.jsonตัวเลือก
โปรดทราบว่าallowSyntheticDefaultImportsจะไม่เปลี่ยนพฤติกรรมรันไทม์ของโค้ดของคุณเลย เป็นเพียงแฟล็กที่บอก TypeScript ว่าตัวโหลดโมดูลของคุณสร้างdefaultเอ็กซ์พอร์ตเมื่อไม่มีอยู่ มันจะไม่ทำให้โค้ดของคุณทำงานใน nodejs ได้อย่างน่าอัศจรรย์เมื่อก่อนหน้านี้
javascriptเป็นแท็กหลักและลาเพราะแท็กหลักที่นี่คือecmascript-6typescriptคำถามผิดอนุมานว่าexport =(คุณลักษณะ TS) อาจจะจับคู่กับimport ... fromในขณะที่มันควรจะจับคู่กับimport =โดยพื้นฐานแล้วเป็นการนำเข้า / ส่งออกโมดูล ES6 เทียบกับ CJS / AMD