interface
là khi bạn chỉ muốn mô tả hình dạng của một đối tượng. Không có thế hệ mã, bao giờ hết, đối với các giao diện - chúng chỉ là một tạo phẩm trong hệ thống kiểu. Bạn sẽ thấy không có sự khác biệt trong việc tạo mã cho một lớp tùy thuộc vào việc nó có mệnh đề là implements
hay không.
declare class
là khi bạn muốn mô tả một hiện lớp (thường là một lớp nguyên cảo, nhưng không phải luôn luôn) có nghĩa là sẽ được bên ngoài hiện tại (ví dụ, bạn có hai .ts file biên dịch để hai .js các tệp và cả hai được bao gồm qua các thẻ script
trong một trang web). Nếu bạn kế thừa từ một số class
sử dụng extends
(bất kể loại cơ sở là declare class
hoặc class
thường xuyên) thì trình biên dịch sẽ tạo tất cả mã để móc chuỗi nguyên mẫu và trình tạo chuyển tiếp và những gì không.
Nếu bạn cố gắng kế thừa từ một số declare class
mà lẽ ra phải là một giao diện, bạn sẽ gặp lỗi thời gian chạy vì mã được tạo ra đó sẽ đề cập đến một đối tượng không có biểu hiện thời gian chạy.
Ngược lại, nếu bạn chỉ đơn giản là implement
một giao diện phải là declare class
, bạn sẽ phải tự mình thực hiện lại tất cả các thành viên và sẽ không tận dụng bất kỳ mã nào sử dụng lại từ là lớp cơ sở và các hàm kiểm tra chuỗi nguyên mẫu khi chạy sẽ từ chối đối tượng của bạn vì không thực sự là một thể hiện của lớp cơ sở.
Để có được thực sự Nerdy, nếu bạn có một ++ nền C, bạn gần như có thể nghĩ về interface
như typedef
và declare class
như một lời tuyên bố extern
của một nhà xây dựng mà thiếu chặt chẽ một định nghĩa trong đơn vị biên dịch này.
Từ một mặt tiêu thụ thuần túy (viết mã bắt buộc, không thêm loại mới), khác biệt duy nhất giữa interface
và declare class
là bạn không thể new
giao diện. Tuy nhiên, nếu bạn dự định extend
/implement
một trong các loại này trong một số class
mới, bạn hoàn toàn phải chọn chính xác giữa interface
và declare class
. Chỉ một trong số họ sẽ làm việc.
Hai quy tắc đó sẽ phục vụ bạn tốt:
- là tên của loại xếp thẳng với một hàm constructor (một cái gì đó invokable với
new
) đó là thực hiện trong thời gian chạy (ví dụ Date
, nhưng JQueryStatic
không phải là) ? Nếu no, bạn chắc chắn muốn interface
- Tôi có đang xử lý một lớp được biên dịch từ một tệp TypeScript khác hoặc một thứ tương tự đủ không? Nếu có, sử dụng
declare class
Nguồn
2013-01-15 22:27:16
Xem http://stackoverflow.com/a/14323673/1704166 –
Tôi không cảm thấy rằng một trong hai mô tả này thực sự giúp bạn mô tả bạn sẽ sử dụng cái khác vì cả hai đều có thể thực hiện điều tương tự mà không có đầu ra JS. – Chris