Tại sao Typecript sử dụng từ khóa Xuất khẩu trực tuyến để làm cho các lớp và giao diện công khai?


135

Trong khi tìm hiểu về Bản mô tả, tôi nhận ra các lớp của mình trong các mô-đun (được sử dụng làm không gian tên) không có sẵn cho các lớp khác trừ khi tôi viết exporttừ khóa trước chúng, chẳng hạn như:

module some.namespace.here
{
   export class SomeClass{..}
}

Vì vậy, bây giờ tôi có thể sử dụng mã trên như thế này:

var someVar = new some.namespace.here.SomeClass();

Tuy nhiên, tôi chỉ tự hỏi tại sao từ khóa này được sử dụng trái ngược với việc chỉ sử dụng publictừ khóa được sử dụng ở cấp phương thức để biểu thị rằng một phương thức hoặc thuộc tính nên có thể truy cập được từ bên ngoài. Vậy tại sao không sử dụng cơ chế tương tự này để làm cho các lớp và giao diện vv hiển thị bên ngoài?

Điều này sẽ cung cấp mã kết quả như:

module some.namespace.here
{
   public class SomeClass{..}
}

Câu trả lời:


176

Lý do chính là exportphù hợp với các kế hoạch cho ECMAScript. Bạn có thể lập luận rằng "đáng lẽ họ nên sử dụng" xuất "thay vì" công khai ", nhưng ngoài" xuất / riêng / được bảo vệ "là một bộ sửa đổi truy cập kém phù hợp, tôi tin rằng có một sự khác biệt tinh tế giữa hai giải thích này .

Trong TypeScript, đánh dấu một thành viên lớp là publichoặc privatekhông có tác dụng đối với JavaScript được tạo. Nó chỉ đơn giản là một công cụ thời gian thiết kế / biên dịch mà bạn có thể sử dụng để ngăn chặn mã TypeScript của bạn truy cập vào những thứ không nên.

Với exporttừ khóa, JavaScript thêm một dòng để thêm mục đã xuất vào mô-đun. Trong ví dụ của bạn : here.SomeClass = SomeClass;.

Vì vậy, về mặt khái niệm, khả năng hiển thị như được kiểm soát bởi publicprivatechỉ dành cho công cụ, trong khi exporttừ khóa thay đổi đầu ra.


1
Cảm ơn thông tin, tôi cho rằng quyết định là như bạn nói để tránh phải kiểm tra ngữ cảnh của từ khóa, điều này thật đáng xấu hổ vì nó giống như một cái gì đó sẽ khiến một vài người gặp phải và thực sự không có sự khác biệt logic trong hành vi đến cách bạn mong đợi công chúng hành động, chỉ làm cho việc triển khai của họ dễ dàng hơn.
Grofit

Cảm ơn vì điều đó. Cứu tôi kéo tóc.
Kent Aguilar

1
Nó là cần thiết nếu bạn đang sử dụng các mô-đun. Nếu ứng dụng của bạn hướng về phía lớn hơn, các mô-đun thường là lựa chọn tốt hơn so với việc tạo các gói lớn / tải tất cả các tệp của bạn lên phía trước.
Fenton

@Fenton Không có nghĩa là "bạn có thể lập luận rằng họ nên sử dụng 'công khai' thay vì 'xuất khẩu'?
Alan Evangelista

@AlanEvangelista chắc chắn bạn cũng có thể tranh luận theo cách đó, đặc biệt nếu nền của bạn là Java / C # chứ không phải JavaScript.
Fenton

49

Một vài điều cần thêm vào câu trả lời của Steve Fenton:

  • export đã có nghĩa là hai điều khác nhau (tùy thuộc vào việc nó ở cấp cao nhất hay không); làm cho nó có nghĩa là một phần ba có thể tồi tệ hơn việc thêm public/private
  • Đó chắc chắn không phải là để thực hiện dễ dàng hơn; sự phức tạp thêm vào của publicvs exportlà tầm thường. Chúng tôi đã thay đổi từ khóa xung quanh một bó rồi; nó không khó.
  • Khả năng hiển thị mặc định của các thành viên lớp phải được công khai để phù hợp với đề xuất của lớp ES6, do đó chúng tôi cần một số từ khóa để cho biết "không công khai". Không có một từ trái nghĩa phù hợp với export( unexport??), vì vậy đó privatelà sự lựa chọn hợp lý. Một khi bạn có private, sẽ không có gì điên rồ khi không chọn publiclàm đối tác của nó
  • Sử dụng exportđể sửa đổi mức độ hiển thị trong các mô-đun bên trong là căn chỉnh dự đoán tốt nhất với các mô-đun ES6

1
cảm ơn về thông tin bổ sung, tôi hoàn toàn đồng ý với công chúng / tư nhân ở cấp thành viên, tôi chỉ thấy nó không đủ cho tất cả các cấp truy cập. Tuy nhiên đây là ý kiến ​​cá nhân và từ khóa là từ khóa, chỉ muốn tìm hiểu thêm.
Grofit

5
Tôi xác định lại tuyên bố táo tợn của mình về việc dễ thực hiện và đưa ra +1 như một lời xin lỗi :)
Fenton

2
Tôi đồng ý với một số điều bạn đang nói nhưng tôi không đồng ý với tuyên bố "Không có từ trái nghĩa phù hợp để xuất" - "nhập" là từ trái nghĩa và là cách mà TypeScript sử dụng, khi bạn xác định một lớp có thể xuất được, thì bạn sẽ nhập nó vào các tệp export class User { name: string } khác Một tệp khác: import {User} from ""./the_file_path_to_the_user_class; xem phần 3.3 của tài liệu bản địa ở đây docs.nativecript.org/angular/tutorial/ng-ch CHƯƠNG
Adam Diament

3
Làm thế nào để sử dụng importđể chỉ ra "giá trị này không được xuất " là cách sử dụng từ khóa phù hợp?
Ryan Cavanaugh

5
"Không có một từ trái nghĩa phù hợp để xuất khẩu (unexport ??)" - một từ trái nghĩa phù hợp cho xuất khẩu nên bị cấm vận.
rsp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.