ทำความเข้าใจโมดูลภายใน/ภายนอกและการนำเข้า/เรียกใช้ Typescript 0.8.2
มีคำถามจำนวนมากใน StackOverflow ที่เกี่ยวกับหัวข้อนี้ แต่บางคำถามก็ไม่ตรงกับสิ่งที่ผมพยายามทำ หรือเป็นสำหรับเวอร์ชันก่อนหน้าของ TypeScript
ฉันกำลังทำงานในโครงการ TypeScript ขนาดค่อนข้างใหญ่ และมีโมดูลที่แบ่งออกเป็นหลายไฟล์ ไม่ได้แยกไฟล์ต่อหนึ่งคลาส
ในเวอร์ชัน 0.8.0 สิ่งนี้ทำงานได้ดี:
//* driver.ts *//
/// <reference path="express.d.ts"/>
/// <reference path="a.ts"/>
/// <reference path="b.ts"/>
.
//* a.ts *//
/// <reference path="driver.ts"/>
module m {
import express = module("express");
export class a {
A: m.b;
A2: express.ServerResponse;
}
}
.
//* b.ts *//
/// <reference path="driver.ts"/>
module m {
export class b {
B: number;
}
}
ในเวอร์ชัน 0.8.1 ฉันต้องเปลี่ยน a.ts ด้วยกลเม็ด export import:
//* a.ts *//
/// <reference path="driver.ts"/>
module m {
export import express = module("express");
export class a {
A: m.b;
A2: express.ServerResponse;
}
}
อย่างไรก็ตาม ในเวอร์ชัน 0.8.2 การนำเข้าไม่สามารถอยู่ภายในคำประกาศโมดูลได้อีกต่อไป ดังนั้น a.ts จึงเปลี่ยนไปเป็น:
//* a.ts *//
/// <reference path="driver.ts"/>
import express = module("express");
module m {
export class a {
A: m.b;
A2: express.ServerResponse;
}
}
ซึ่งตอนนี้ทำให้เกิดข้อผิดพลาดเพราะ a.ts ไม่มองเห็นนามสกุลของโมดูลใน b.ts.
สิ่งที่ฉันเข้าใจ:
- a.ts กลายเป็นโมดูลภายนอก เนื่องจากคำสั่ง import
- การลบการนำเข้าใน a.ts ทำให้ a และ b และโมดูลของฉันรวมเข้าด้วยกันได้อย่างราบรื่น
- การเปลี่ยนการนำเข้าไปเป็นคำสั่ง require จะทำให้สูญเสียการกำหนดประเภทใน express.d.ts
สิ่งที่ฉันไม่เข้าใจ:
- มันไม่มีวิธีจริง ๆ ที่ฉันจะหลีกเลี่ยงเรื่องนี้โดยไม่รวมไฟล์โมดูลทั้งหมดของฉันเข้าด้วยกันหรือ?
ฉันขอโทษถ้าข้อนี้ถูกตอบไว้ที่อื่นแล้ว -- แค่ส่งลิงก์ให้ฉันก็พอ -- แต่ปัญหาอื่นๆ ที่คล้ายกันดูเหมือนจะไม่ได้ตอบเรื่องนี้อย่างชัดเจน
คำตอบ #1
นี่คือสิ่งที่ฉันตีความจากสถานการณ์ของคุณ
โมดูลของคุณ...
คุณจำเป็นต้องตั้งชื่อไฟล์ของคุณตามโมดูลของคุณ ดังนั้น a.ts ควรจะเป็น m.ts และควรมีเนื้อหาบางอย่างเช่น...
import express = module('express');
export class a {
A: b;
A2: express.ServerResponse;
}
export class b {
B: number;
}
คุณไม่ควรใช้คำสั่ง reference ที่นี่
เมื่อคุณกำลังรันโค้ดบน Node.js คุณไม่สามารถแยกโค้ดของคุณเป็นหลายไฟล์ได้จริง ๆ เพราะไฟล์นั้นเองคือโมดูลของคุณ - เมื่อคุณ import m=module('m'); มันจะค้นหา m.js สิ่งที่คุณ สามารถ ทำได้คือจัดระเบียบไฟล์ของคุณในโครงสร้างโฟลเดอร์
import x = module('m/x'); // m/x.js
import y = module('m/y'); // m/y.js
