เหตุใด typescript จึงใช้คีย์เวิร์ด“ export” เพื่อทำให้คลาสและอินเทอร์เฟซเป็นสาธารณะ


138

ในขณะที่ขลุกอยู่กับ typescript ฉันพบว่าคลาสของฉันภายในโมดูล (ใช้เป็นเนมสเปซ) ไม่สามารถใช้ได้กับคลาสอื่นเว้นแต่ฉันจะเขียนexportคีย์เวิร์ดก่อนหน้านั้นเช่น

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

ตอนนี้ฉันสามารถใช้รหัสด้านบนดังนี้:

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

อย่างไรก็ตามฉันแค่สงสัยว่าเหตุใดจึงใช้คำหลักนี้ตรงข้ามกับการใช้publicคำหลักที่ใช้ในระดับวิธีการเพื่อแสดงว่าวิธีการหรือคุณสมบัติควรสามารถเข้าถึงได้จากภายนอก ทำไมไม่ใช้กลไกเดียวกันนี้เพื่อทำให้คลาสและอินเทอร์เฟซอื่น ๆ มองเห็นได้จากภายนอก?

สิ่งนี้จะให้รหัสผลลัพธ์เช่น:

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

คำตอบ:


179

เหตุผลหลักคือexportตรงกับแผนสำหรับ ECMAScript คุณสามารถโต้แย้งว่า "ควรใช้" ส่งออก "แทน" สาธารณะ "แต่นอกเหนือจาก" การส่งออก / ส่วนตัว / ที่ได้รับการป้องกัน "เป็นชุดตัวแก้ไขการเข้าถึงที่ไม่ตรงกันฉันเชื่อว่ามีความแตกต่างเล็กน้อยระหว่างทั้งสองอย่างที่อธิบายถึงเรื่องนี้ .

ใน TypeScript การทำเครื่องหมายสมาชิกคลาสเป็นpublicหรือprivateไม่มีผลต่อ JavaScript ที่สร้างขึ้น มันเป็นเพียงเครื่องมือออกแบบ / รวบรวมเวลาที่คุณสามารถใช้เพื่อหยุดรหัส TypeScript ของคุณที่เข้าถึงสิ่งที่ไม่ควร

ด้วยexportคำสำคัญ JavaScript จะเพิ่มบรรทัดเพื่อเพิ่มรายการที่ส่งออกไปยังโมดูล ในตัวอย่างของคุณ: here.SomeClass = SomeClass;.

ดังนั้นในแนวความคิดการมองเห็นตามที่ควบคุมpublicและprivateเป็นเพียงสำหรับการใช้เครื่องมือในขณะที่exportคีย์เวิร์ดเปลี่ยนผลลัพธ์


1
ขอบคุณสำหรับข้อมูลฉันคิดว่าการตัดสินใจเป็นไปตามที่คุณพูดเพื่อหลีกเลี่ยงการตรวจสอบบริบทของคำหลักซึ่งเป็นเรื่องที่น่าเสียดายเนื่องจากรู้สึกว่าเป็นสิ่งที่จะทำให้คนไม่กี่คนขึ้นไปและไม่มีความแตกต่างในเชิงตรรกะ ถึงวิธีที่คุณคาดหวังให้สาธารณชนดำเนินการเพียงแค่ทำให้การนำไปใช้งานง่ายขึ้น
Grofit

ขอบคุณสำหรับสิ่งนี้. ช่วยฉันดึงผม
Kent Aguilar

1
จำเป็นหากคุณกำลังใช้โมดูล หากแอปของคุณหันไปทางด้านใหญ่โมดูลมักจะเป็นตัวเลือกที่ดีกว่าการสร้างบันเดิลขนาดใหญ่ / โหลดไฟล์ทั้งหมดไว้ด้านหน้า
เฟนตัน

@ เฟนตันคุณไม่ได้หมายถึง "คุณสามารถโต้แย้งได้ว่าพวกเขาควรใช้" สาธารณะ "แทน" ส่งออก "หรือไม่
Alan Evangelista

@AlanEvangelista คุณสามารถโต้แย้งได้เช่นกันโดยเฉพาะถ้าพื้นหลังของคุณเป็น Java / C # แทนที่จะเป็น JavaScript
Fenton

51

บางสิ่งที่จะเพิ่มในคำตอบของ Steve Fenton:

  • export หมายถึงสองสิ่งที่แตกต่างกันอยู่แล้ว (ขึ้นอยู่กับว่าอยู่ในระดับบนสุดหรือไม่) การทำให้หมายถึงหนึ่งในสามอาจแย่กว่าการเพิ่มpublic/private
  • แน่นอนว่าจะไม่ทำให้การนำไปใช้งานง่ายขึ้น ความซับซ้อนที่เพิ่มเข้ามาของpublicvs exportเป็นเรื่องเล็กน้อย เราได้เปลี่ยนคำหลักไปหลายคำแล้ว มันไม่ยาก
  • การเปิดเผยเริ่มต้นของสมาชิกชั้นเรียนต้องเป็นแบบสาธารณะเพื่อให้สอดคล้องกับข้อเสนอของคลาส ES6 ดังนั้นเราจึงต้องมีคีย์เวิร์ดเพื่อระบุว่า "ไม่ใช่สาธารณะ" ไม่มีคำตรงข้ามที่เหมาะสมกับexport( unexport??) ดังนั้นจึงprivateเป็นตัวเลือกเชิงตรรกะ เมื่อคุณมีprivateแล้วมันจะค่อนข้างบ้าที่จะไม่เลือกpublicเป็นคู่ของมัน
  • การใช้exportเพื่อแก้ไขการมองเห็นในโมดูลภายในเป็นการจัดแนวที่คาดเดาได้ดีที่สุดกับโมดูล ES6

1
ขอบคุณสำหรับข้อมูลเพิ่มเติมฉันเห็นด้วยอย่างยิ่งกับภาครัฐ / เอกชนในระดับสมาชิกฉันพบว่ามันแปลกที่ไม่เพียงพอสำหรับการเข้าถึงทุกระดับ อย่างไรก็ตามนี่เป็นความคิดเห็นส่วนตัวและคีย์เวิร์ดเป็นคีย์เวิร์ดเพียงแค่ต้องการหาข้อมูลเพิ่มเติม
Grofit

5
ฉันแก้ไขคำพูดที่หน้าด้านของฉันเกี่ยวกับความง่ายในการใช้งานและเสนอ +1 เป็นการขอโทษ :)
เฟนตัน

2
ฉันเห็นด้วยกับบางสิ่งที่คุณกำลังพูด แต่ฉันไม่เห็นด้วยกับคำว่า "ไม่มีคำตรงข้ามที่เหมาะสมในการส่งออก" - "นำเข้า" เป็นคำตรงข้ามและเป็นสิ่งที่ TypeScript ใช้เมื่อคุณกำหนดคลาสที่สามารถส่งออกได้ นำเข้าไฟล์อื่นไฟล์ export class User { name: string } อื่น: import {User} from ""./the_file_path_to_the_user_class; ดูส่วน 3.3 ของเอกสารnativescript
Adam Diament

3
การใช้importเพื่อระบุว่า "ค่านี้ไม่ได้ถูกส่งออก " เป็นการใช้คำหลักที่เหมาะสมอย่างไร
Ryan Cavanaugh

6
"ไม่มีคำตรงข้ามที่เหมาะสมในการส่งออก (unexport ??)" - คำตรงข้ามที่เหมาะสมสำหรับการส่งออกควรได้รับการห้าม
rsp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.