2012-10-20 30 views
12

Tôi tự hỏi nếu có thể bằng cách nào đó có hai hoặc nhiều lớp trong hai hoặc nhiều tệp được thêm vào cùng một mô-đun trong TypeScript. Một cái gì đó như thế này:Mô-đun TypeScript

//src/gui/uielement.ts 
module mylib { 
    module gui { 
     export interface UIElement { 
      public draw() : void; 
     } 
    } 
} 

//src/gui/button.ts 
///<reference path='uielement.ts'/> 
module mylib { 
    module gui { 
     export class Button implements UIElement { 
      constructor(public str : string) { } 
      draw() : void { } 
     } 
    } 
} 

Có thể sẽ có hàng tá lớp GUI, do đó, tất cả chúng trong cùng một tệp sẽ không thể thực hiện được. Và tất cả các lớp của tôi sẽ ở trong mô-đun 'mylib'. Nhưng làm cách nào để làm điều đó?

Nếu module mylib {...} được dịch sang một hàm thì tất cả nội dung của tất cả các khối mylib trong tất cả các tệp phải được chứa trong cùng một hàm.

Điều này có thể thực hiện được không?

Khi tôi biên dịch tôi có được điều này:

$ tsc src/gui/button.ts 
src/gui/button.ts(4,39): The name 'UIElement' does not exist in the current scope 
+0

Vâng, đây được hỗ trợ. Không chắc tại sao bạn không thử nó. –

+0

Tôi đã làm. Xin lỗi vì không giải thích được lỗi tôi nhận được ... sẽ mô tả thêm. –

Trả lời

22

Đây chính là cách thức hoạt động! Nếu bạn nhìn vào tạo mã javascript, nó thêm như một chức năng vô danh mà chấp nhận một đối tượng, các "đối tượng mô-đun":

var mylib; 
(function (mylib) { 
    var Button = (function() { 
     function Button(x) { 
      this.x = x; 
     } 
     return Button; 
    })(); 
    mylib.Button = Button;  
})(mylib || (mylib = {})); 

Nếu bạn nhìn vào dòng cuối cùng (})(mylib || (mylib = {}));), bạn thấy rằng nó khởi tạo một ojbect mới (mylib = {}) chỉ khi biến hiện tại là sai (hoặc cái gì đó đánh giá sai, như null). Bằng cách đó, tất cả "mô-đun" được đặt tên giống nhau sẽ được hợp nhất vào cùng một đối tượng.

Do đó, các mô-đun nội bộ mở rộng lẫn nhau. Tôi phải lưu ý rằng tôi đã không hoàn toàn tìm ra những gì xảy ra với các mô-đun lồng nhau.

Cập nhật: Mã của bạn hoạt động cho tôi nếu tôi không sử dụng cú pháp mô đun lồng nhau, nhưng thay đổi thành cú pháp chấm. ví dụ .:

module mylib.gui { 
} 

thay vì

module mylib { 
    module gui { 
    } 
} 

Tôi sẽ cố gắng để điều tra lý do tại sao điều này xảy ra, như xa như tôi đã đọc spec, cả hai cách cần được bình đẳng.

Cập nhật: nếu module tham chiếu lồng nhau được đánh dấu là xuất khẩu, nó hoạt động:

module mylib { 
    export module gui { 
    } 
}