อะไรคือสิ่งที่เทียบเท่าของ struct ใน Rust ใน TypeScript?
ฉันเขียนโปรแกรมด้วย TypeScript มาประมาณหนึ่งปี และฉันเจอโครงการดี ๆ บน Github ที่เขียนด้วย Rust ซึ่งฉันอยากห่อหุ้มด้วย TypeScript ฉันไม่เคยเขียนโปรแกรมด้วย Rust มาก่อน แต่ฉันมีประสบการณ์ใน C++ ฉันเชื่อว่าคำถามของฉันในหัวข้อนั้นชัดเจนพอแล้ว struct ใน Rust คล้ายกับ interface ใน TypeScript หรือไม่?
คำตอบ #1
โครงสร้าง (struct) ใน Rust คล้ายกับอินเทอร์เฟซ (interface) ใน TypeScript ไหม?
ก็ประมาณนั้น แต่ไม่ใช่
อินเทอร์เฟซของ TypeScript ประกาศว่าสมาชิกใดบ้างที่วัตถุต้องมีเพื่อให้ตรงตามอินเทอร์เฟซ แต่ก็สามารถมีสมาชิก เพิ่มเติม ได้ วัตถุ JavaScript หนึ่งอาจตรงตามอินเทอร์เฟซ TypeScript หลาย อินเทอร์เฟซที่มีรูปร่างแตกต่างกันมากได้ เพียงโดยการมีทุกสิ่งที่จำเป็นสำหรับอินเทอร์เฟซเหล่านั้นพร้อมกัน
ใน Rust struct เป็นการกำหนดประเภทผสม ทุกค่าของประเภทนั้นจะมีสมาชิกตามที่ประกาศในนิยามของ struct พอดี -- ไม่มากไป ไม่ขาดไป
จะเป็นการเปรียบเทียบที่ดีกว่าถ้าพูดว่าอินเทอร์เฟซของ TypeScript คล้ายกับ trait ของ Rust ทั้งสองประกาศชุดของ "สิ่งที่" ที่จำเป็นต้องมีเพื่อให้ตรงตามอินเทอร์เฟซ/trait และสามารถมีการใช้งานหลาย trait บน struct เดียวกันได้ อย่างไรก็ตาม นี่ยังไม่ใช่การเปรียบเทียบที่ถูกต้อง 100% เพราะ trait ไม่สามารถประกาศฟิลด์ (สมาชิกข้อมูล/คุณสมบัติ) ได้ มีเพียงฟังก์ชัน, ค่าคงที่, และประเภทเท่านั้น
นอกจากนี้ โปรดทราบว่าอินเทอร์เฟซของ TypeScript เป็นแบบเชิงโครงสร้าง ไม่ใช่แบบชื่อเฉพาะ นั่นหมายความว่าอินเทอร์เฟซ TypeScript สองตัวที่มีโครงสร้างเหมือนกันเป๊ะ ๆ สามารถใช้แทนกันได้แม้ว่าจะมีชื่อแตกต่างกัน คุณสามารถ "แปลง" ตัวแปรจากอินเทอร์เฟซหนึ่งไปยังอีกอินเทอร์เฟซหนึ่งได้โดยอัตโนมัติ และไม่จำเป็นต้องใช้การแปลงชนิด ใน Rust โครงสร้างข้อมูลสองตัวที่มีฟิลด์ประกาศเหมือนกัน ไม่สามารถใช้แทนกันได้ในลักษณะนี้ และสิ่งนี้ก็ไม่สามารถใช้กับ traits ที่มีเนื้อหาเหมือนกันได้เช่นกัน (ถ้าเป็นเช่นนั้น traits แบบเครื่องหมาย เช่น Copy, Send, Sync เป็นต้น ก็จะไม่สามารถมีอยู่ได้ เพราะมันจะถูกใช้งานโดยอัตโนมัติกับทุกชนิด!)
อะไรคือสิ่งที่เทียบเท่าของ struct ใน Rust ใน TypeScript?
จริงๆ แล้วไม่มีคำที่เทียบเคียงได้ดี Structs กำหนดว่าค่ามีฟิลด์อะไรบ้าง แต่ใน JavaScript/TypeScript ออบเจ็กต์ไม่ได้มีรูปแบบที่ไม่สามารถเปลี่ยนแปลงได้ — พวกมันสามารถถูกขยายด้วยสิ่งใหม่ ๆ ได้ตลอดเวลา (ยกเว้นเมื่อถูก freeze หรือ sealed) ดังนั้น JavaScript จึงไม่จำเป็นต้องมีแนวคิดของ "struct" โดยตรง ภาษาที่มีประเภทแบบไดนามิกโดยทั่วไปจะไม่จำเป็นต้องประกาศฟิลด์; นี่เป็นสิ่งที่คุณมักจะเห็นเฉพาะในภาษาที่มีประเภทแบบคงที่
TypeScript นำการพิมพ์แบบคงที่บางส่วนมาสู่ความไดนามิกของ JavaScript แต่ความไดนามิกนั้นยังคงมีอยู่แม้ใน TypeScript TypeScript ไม่ใช่ "JavaScript แบบพิมพ์คงที่" มากนัก แต่เป็น "JavaScript ที่มีการตรวจสอบประเภทบางส่วนแทรกอยู่"
คำตอบ #2
Typescript "type alias" เทียบเท่ากับ Rust "Struct" มีความแตกต่างอย่างมากในการใช้ Interfaces และ Types Alias; Interfaces ถูกใช้มากกว่าสำหรับการกำหนดชนิดที่เน้น API
การใช้ชื่อประเภทเป็นคำเปรียบเทียบที่สมบูรณ์แบบสำหรับ Struct ใน TS