ทำไมมันไม่ทำงาน
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-6
typescript
คำถามผิดอนุมานว่าexport =
(คุณลักษณะ TS) อาจจะจับคู่กับimport ... from
ในขณะที่มันควรจะจับคู่กับimport =
โดยพื้นฐานแล้วเป็นการนำเข้า / ส่งออกโมดูล ES6 เทียบกับ CJS / AMD