2013-04-18 16 views
5

Dường như nó sẽ rất hữu ích trong TypeScript để yêu cầu một mô-đun thực hiện một giao diện. Có lý do cụ thể nào khiến họ chọn không thực hiện khả năng này không?Tại sao các mô-đun TypeScript không thể triển khai hoặc tuân thủ giao diện? Tôi có thể giải quyết chuyện này không?

Tôi không thể nghĩ ra lý do tại sao nó không mong muốn cho phép một mô-đun thực hiện một giao diện, nhưng nếu có, thì có cách nào khác để yêu cầu một mô-đun cung cấp một tập hợp các thuộc tính/phương pháp nhất định không?

+0

Đặt một lớp trong mô-đun mà thực hiện giao diện, bạn chỉ là một chấm xa có những gì bạn muốn. – Fenton

+0

Đó sẽ là điều không mong muốn đối với tôi nhưng tôi đã nghĩ về điều đó trước khi đặt câu hỏi này. Nếu tôi đã làm điều đó, tôi sẽ có thêm một định nghĩa không cần thiết và tôi cũng phải phân biệt giữa định nghĩa của kiểu và sự gán của cá thể. –

Trả lời

4

Bạn có thể buộc một lỗi biên dịch nếu một mô-đun không tuân thủ một giao diện như thế này (về mặt kỹ thuật khác không chạy trên cao, nhưng khó có khả năng thực sự vấn đề):

interface foo { 
    bar(): number; 
} 

module mod { 
    export function bar(): number { 
     return 0; 
    } 
} 
var mod_is_foo: foo = mod; // errors if you change 'number' to 'string' above 

Đối với lý do tại sao có thể không bạn nói module mod implements foo? All features start at minus 100.

Chỉnh sửa để thêm - đây là một số (phần hơi ngớ ngẩn) những thứ khác bạn có thể viết thay cho tuyên bố var trên nếu bạn muốn tránh tạo ra một top-level var mới:

<foo>mod; // Shortest, probably fastest? 
<foo>undefined === mod; // Clearest non-var version? 
+0

Cảm ơn bạn đã phản hồi trực tiếp Ryan, bạn và nhóm đang làm những điều tuyệt vời. Tôi sẽ bắt đầu tham gia vào khu vực bảng chữ cái trên codeplex. –

+0

Tôi đã thực sự có thể sử dụng công việc này xung quanh, nhưng theo một cách hơi khác. Tôi đã xây dựng các thành phần đã được sử dụng trong một mô hình hòa giải và tôi đã "đăng ký" tất cả các thành phần với hệ thống cốt lõi. Khi tôi đăng ký chúng, tôi đã chuyển mô-đun thực tế vào một phương thức và tôi chỉ thực hiện phương thức đó chỉ chấp nhận một giao diện chứa mọi thứ mà tôi muốn các mô-đun cung cấp. Bằng cách đó, nó đảm bảo các mô-đun đó tuân theo giao diện. Cảm ơn Ryan lần nữa! –

+1

Kể từ TypeScript 9.1, bạn có thể sử dụng từ khóa 'typeof' để giải quyết vấn đề này: http://blogs.msdn.com/b/typescript/archive/2013/08/06/announcing-0-9-1.aspx – Dan

1

Ryan là thực sự thuộc nhóm Typescript nên câu trả lời của anh ấy khá là cuối cùng. Nhưng cá nhân tôi nghĩ rằng nó tốt đẹp mà nó không cung cấp cú pháp bạn tìm kiếm.

Lý do là một mô-đun giống như một thể hiện thay vì là một thứ có thể được khởi tạo (ví dụ: một lớp). Bằng cách này nó gần với một var hơn một lớp.

Vì vậy, lý do trở thành rằng tương tự của nó tại sao bạn sẽ viết:

var x:foo; 

thay vì

var x implements foo; 

module cư xử giống nhau ở chỗ bạn có thể làm

var y:foo = mod; 

như Ryan đã chỉ ra rồi.

Ngoài ra kiểm tra này ra:

interface foo { 
    bar(): number; 
} 

module mod { 
    export function bar(): number { 
     return 0; 
    } 
} 

var x: foo; 
x = mod; 

// Still a bit whacky but allowed as module is a type as well as an instance 
var y:mod; 
y = x; 
Các vấn đề liên quan