ค้นหาเว็บไซต์

ทำความเข้าใจโมดูลภายใน/ภายนอกและการนำเข้า/เรียกใช้ 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

บทความที่เกี่ยวข้อง