😎 React TypeScript

เจาะลึก TypeScript สำหรับ React: สรุป Syntax ที่โปรแกรมเมอร์มือใหม่ต้องรู้

9 นาที 18 views บันทึกเป็น PDF
เจาะลึก TypeScript สำหรับ React: สรุป Syntax ที่โปรแกรมเมอร์มือใหม่ต้องรู้

เรียนรู้พื้นฐาน TypeScript สำหรับ React ตั้งแต่ Primitive Types, Interface, ไปจนถึง Generics เพื่อลดบั๊กและเขียนโค้ดให้ปลอดภัยและเป็นมืออาชีพมากขึ้น

ทำไมต้องใช้ TypeScript ในการเขียน React?

เวลาเราเขียน React ด้วย JavaScript ปกติ เรามักจะเจอปัญหาบั๊กกวนใจบ่อยๆ เช่น การส่งข้อมูลผิดประเภทเข้าไปใน Component (ส่วนประกอบของหน้าจอที่นำมาประกอบกัน) หรือการเรียกใช้ค่าที่ไม่มีอยู่จริงจนโปรแกรมพัง การใช้ TypeScript ซึ่งเป็นภาษาที่ต่อยอดมาจาก JavaScript โดยเพิ่มระบบ Type Checking (การตรวจสอบประเภทของข้อมูล) เข้ามา จะช่วยให้เราเห็นข้อผิดพลาดตั้งแต่ตอนเขียนโค้ด แทนที่จะต้องไปรอเจอตอนรันโปรแกรม

ลองเปรียบเทียบง่ายๆ เหมือนการจัดกระเป๋าเดินทาง ถ้า JavaScript คือการโยนของทุกอย่างลงกระเป๋าโดยไม่เช็คอะไรเลย TypeScript ก็เหมือนการมีเช็คลิสต์ที่บอกว่าช่องไหนต้องใส่เสื้อ ช่องไหนต้องใส่รองเท้า ถ้าคุณพยายามยัดรองเท้าลงช่องใส่เสื้อ ระบบจะเตือนคุณทันทีว่า "ผิดที่นะ!" ทำให้เรามั่นใจได้ว่าโค้ดที่เขียนลงไปนั้นมีโครงสร้างที่ถูกต้องและปลอดภัย

สำหรับมือใหม่ การเริ่มเรียน TypeScript อาจจะดูเหมือนเพิ่มภาระ แต่ในระยะยาวมันคือเครื่องมือที่ช่วยให้เราทำงานได้ไวขึ้น เพราะ IDE (โปรแกรมที่ใช้เขียนโค้ด เช่น VS Code) จะสามารถแนะนำโค้ด (Autocomplete) ได้แม่นยำขึ้นมาก เมื่อเรากำหนดประเภทข้อมูลชัดเจน โปรแกรมจะรู้ทันทีว่าตัวแปรนี้มีคุณสมบัติอะไรบ้าง ทำให้เราไม่ต้องสลับไปดูไฟล์อื่นเพื่อเช็คชื่อตัวแปรบ่อยๆ

Primitive Types: พื้นฐานที่ต้องแม่นยำ

ในโลกของ TypeScript ข้อมูลพื้นฐานที่เราเรียกว่า Primitive Types คือประเภทข้อมูลที่เล็กที่สุดและเป็นหน่วยย่อยที่สุด เช่น string (ข้อความ), number (ตัวเลข), boolean (ค่าความจริง ใช่/ไม่ใช่) และ null กับ undefined (ค่าที่ว่างเปล่า) การกำหนดประเภทเหล่านี้ให้ตัวแปรจะทำให้โปรแกรมทำงานได้ตามที่เราออกแบบไว้

ลองจินตนาการว่าคุณกำลังสร้างฟอร์มสมัครสมาชิก ถ้าช่อง "อายุ" ถูกตั้งค่าไว้เป็น number แล้วมีคนพยายามพิมพ์ชื่อลงไป TypeScript จะขีดเส้นใต้แดงเตือนทันที นี่คือวิธีป้องกันข้อมูลขยะ (Garbage Data) ที่ดีที่สุด ก่อนที่ข้อมูลนั้นจะถูกส่งไปประมวลผลหลังบ้านหรือบันทึกลง Database (ระบบจัดเก็บข้อมูล)

การประกาศตัวแปรแบบระบุชนิดข้อมูลทำได้ง่ายๆ โดยการใช้เครื่องหมาย : ตามด้วยชื่อประเภทข้อมูล หากเราพยายามเปลี่ยนค่าเป็นประเภทอื่นที่ไม่ตรงกับที่ประกาศไว้ โปรแกรมจะแจ้งเตือนทันที ซึ่งช่วยลดความสับสนเวลาที่ต้องกลับมาแก้โค้ดเก่าหลังจากผ่านไปหลายสัปดาห์

// การประกาศตัวแปรใน TypeScript
const username: string = "Somchai"; // ต้องเป็นข้อความเท่านั้น
const age: number = 25;             // ต้องเป็นตัวเลขเท่านั้น
const isDeveloper: boolean = true;  // ต้องเป็น true หรือ false

// หากเผลอทำแบบนี้จะเกิด Error:
// const age: number = "25"; // ผิด! เพราะ string ไม่ใช่ number

จากตัวอย่างข้างต้น เรากำหนดให้ username เป็น string และ age เป็น number หากเราเผลอใส่ข้อมูลผิดประเภท TypeScript Compiler (เครื่องมือแปลงโค้ด TS เป็น JS) จะไม่ยอมให้เราผ่านไปได้ ซึ่งเป็นเกราะป้องกันชั้นยอดสำหรับโปรแกรมเมอร์มือใหม่

Interface และ Type Aliases: การสร้างแบบแปลนข้อมูล

เมื่อโปรเจกต์ใหญ่ขึ้น ข้อมูลของเราจะไม่ใช่แค่ตัวเลขหรือข้อความตัวเดียว แต่จะเป็น Object (กลุ่มข้อมูล) ที่ซับซ้อนขึ้น เราจึงต้องใช้ Interface หรือ Type Aliases เพื่อสร้าง "แบบแปลน" (Blueprint) ของข้อมูลขึ้นมา เพื่อให้มั่นใจว่าข้อมูลทุกก้อนมีรูปร่างหน้าตาเหมือนกันเป๊ะ

เปรียบเทียบได้กับการสร้างแม่พิมพ์ขนมปัง ไม่ว่าคุณจะใส่แป้งกี่รอบ ถ้าใช้แม่พิมพ์เดิม ขนมปังที่ออกมาก็จะมีรูปทรงเดียวกันเสมอ การใช้ interface ก็เช่นกัน เรากำหนดว่า User หนึ่งคนต้องมี id, name และ email เมื่อเรานำไปใช้ใน React Component เราก็จะได้โครงสร้างข้อมูลที่สม่ำเสมอ ลดความผิดพลาดจากการลืมใส่ค่าบางอย่างไปได้

ความแตกต่างระหว่าง interface และ type นั้นเล็กน้อยมากสำหรับมือใหม่ โดยทั่วไปเรามักใช้ interface สำหรับการกำหนดโครงสร้างของ Object และใช้ type เมื่อต้องการความยืดหยุ่นในการผสมผสานข้อมูลหลายประเภทเข้าด้วยกัน สิ่งสำคัญคือการเลือกใช้ให้สม่ำเสมอภายในโปรเจกต์เดียวกัน

// การกำหนดโครงสร้างด้วย Interface
interface User {
  id: number;
  name: string;
  email?: string; // เครื่องหมาย ? หมายถึงค่านี้จะมีหรือไม่มีก็ได้
}

const newUser: User = {
  id: 1,
  name: "Alice"
  // ไม่ใส่ email ก็ได้เพราะเป็นค่า optional
};

ในโค้ดนี้เราสร้างแบบแปลนชื่อ User ขึ้นมา โดยกำหนดให้ id ต้องเป็นตัวเลขและ name ต้องเป็นข้อความ ส่วน email มีเครื่องหมาย ? ต่อท้าย ซึ่งหมายความว่าเป็นค่าเสริมที่ไม่บังคับ นี่คือหัวใจสำคัญของการเขียนโค้ดที่ยืดหยุ่นแต่ยังคงความปลอดภัยครับ

Union Types: เมื่อข้อมูลเป็นได้มากกว่าหนึ่ง

บางครั้งข้อมูลของเราอาจจะไม่ได้มีประเภทเดียวเสมอไป เช่น สถานะการโหลดข้อมูลที่อาจเป็นได้ทั้ง "กำลังโหลด" หรือ "สำเร็จ" หรือ "ผิดพลาด" ในสถานการณ์นี้ Union Types คือคำตอบ โดยการใช้เครื่องหมาย | (Pipe) เพื่อบอกว่าตัวแปรนี้สามารถเป็นประเภทใดประเภทหนึ่งในรายการที่เรากำหนดได้

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

การใช้ Union Types ช่วยให้โค้ดของเรารองรับความหลากหลายของข้อมูลได้ดีขึ้นโดยไม่เสียความปลอดภัย ใน React บ่อยครั้งที่เราต้องรับค่าจาก API (ช่องทางสื่อสารระหว่างโปรแกรม) ซึ่งบางครั้งข้อมูลอาจจะมาเป็น string หรืออาจจะเป็น number ขึ้นอยู่กับเงื่อนไข การใช้ Union Types จะช่วยให้เราจัดการเคสเหล่านี้ได้อย่างรัดกุม

// การใช้ Union Types
type Status = "loading" | "success" | "error";

function displayStatus(status: Status) {
  console.log("สถานะปัจจุบันคือ: " + status);
}

displayStatus("loading"); // ทำงานได้ปกติ
// displayStatus("pending"); // เกิด Error เพราะ "pending" ไม่อยู่ใน Status

ในตัวอย่างนี้ Status ถูกจำกัดให้เป็นได้เพียงสามค่าเท่านั้น หากเราลองใส่ค่าอื่นที่ไม่อยู่ในรายการ TypeScript จะเตือนเราทันที นี่เป็นเทคนิคที่ยอดเยี่ยมในการควบคุม State (สถานะข้อมูล) ของแอปพลิเคชันให้คาดเดาได้ง่ายขึ้น

Generics: ความยืดหยุ่นแบบมีคุณภาพ

Generics คือหัวข้อที่มือใหม่มักจะกลัว แต่จริงๆ แล้วมันคือ "ตัวแปรแทนประเภทข้อมูล" เปรียบเสมือนกล่องเปล่าที่คุณสามารถระบุได้ว่าวันนี้อยากจะใส่ของอะไรลงไป โดยที่ตัวกล่องยังคงทำหน้าที่รักษาความปลอดภัยของข้อมูลข้างในเหมือนเดิม ไม่ว่าคุณจะใส่อะไรลงไป ระบบก็จะจำได้ว่าคุณใส่ของชนิดนั้นเข้าไป

สมมติคุณมีฟังก์ชันดึงข้อมูลจาก Server ซึ่งคุณไม่รู้ล่วงหน้าว่าข้อมูลที่ได้มาจะเป็นข้อมูล User หรือข้อมูล Product การใช้ any (การยอมให้เป็นอะไรก็ได้) จะทำให้เราเสียประโยชน์ของ TypeScript ไป แต่การใช้ Generics จะช่วยให้เรากำหนดประเภทข้อมูลได้ในตอนที่เราเรียกใช้งานฟังก์ชันนั้นๆ ทำให้เรายังคงได้ระบบตรวจจับข้อผิดพลาดที่แม่นยำอยู่

Generics มักจะเขียนด้วยตัวอักษร ซึ่งเป็นตัวย่อของ Type เมื่อเรานำไปใช้กับ React Component เรามักจะเห็นมันในรูปแบบ React.FC ซึ่งหมายถึง Component นี้ยอมรับ Props (ข้อมูลที่ส่งผ่าน Component) ตามแบบแปลนที่เรากำหนดไว้ เป็นการผสมผสานความยืดหยุ่นและความปลอดภัยเข้าด้วยกันอย่างลงตัว

// ตัวอย่าง Generics ในฟังก์ชัน
function identity(arg: T): T {
  return arg;
}

const output1 = identity("Hello"); // T กลายเป็น string
const output2 = identity(123);     // T กลายเป็น number

ในโค้ดนี้ คือตัวแทนประเภทข้อมูล เมื่อเราเรียก identity("Hello") ตัวแปร T จะถูกแทนที่ด้วย string ทำให้ TypeScript รู้ว่าผลลัพธ์ที่ได้ต้องเป็นข้อความเสมอ ช่วยให้โค้ดของเรานำไปใช้งานซ้ำ (Reusable) ได้ในหลายสถานการณ์โดยไม่ต้องเขียนใหม่

สรุป: การนำไปใช้จริงในโปรเจกต์ React

การฝึกฝน TypeScript ไม่ใช่การท่องจำ Syntax แต่เป็นการฝึกคิดแบบมีระบบ ก่อนเริ่มเขียน Component ใน React ให้คุณลองตั้งคำถามว่า "ข้อมูลที่ส่งมามีหน้าตาอย่างไร?" แล้วสร้าง interface หรือ type รอไว้ก่อนเสมอ วิธีนี้จะช่วยให้งานของคุณราบรื่นขึ้นและลดเวลาการแก้บั๊กในช่วงท้ายได้มหาศาล

ลองนำไปปรับใช้ในโปรเจกต์แรกของคุณ เช่น การสร้างฟอร์มรับข้อมูลผู้ใช้ หรือการแสดงรายการสินค้าจาก API เริ่มต้นจากการกำหนด interface สำหรับข้อมูลแต่ละชิ้น แล้วใช้ Union Types จัดการสถานะการโหลดข้อมูล เมื่อทำจนคล่องแล้วค่อยขยับไปใช้ Generics ในการทำ Component ส่วนกลางที่ใช้ซ้ำได้บ่อยๆ

จำไว้ว่าไม่มีโปรแกรมเมอร์คนไหนเก่ง TypeScript ได้ในวันเดียว เป้าหมายของคุณคือการเขียนโค้ดให้ "อ่านง่ายและปลอดภัยขึ้น" วันละนิด หากเจอบั๊กที่เกี่ยวกับ Type อย่าเพิ่งหงุดหงิด แต่มองว่ามันคือ "ครู" ที่กำลังสอนให้คุณเขียนโค้ดที่แข็งแรงขึ้น ขอให้สนุกกับการเขียนโค้ดและพัฒนาตัวเองต่อไปครับ!

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

วิธีเช็ก Type ด้วย tsc --noEmit และตั้งค่า Environment Variables ใน React TypeScript ก่อน Deploy
React TypeScript

วิธีเช็ก Type ด้วย tsc --noEmit และตั้งค่า Environment Variables ใน React TypeScript ก่อน Deploy

ไม่อยากให้แอปพังตอน Deploy ต้องอ่าน! สอนวิธีใช้ tsc --noEmit ตรวจสอบข้อผิดพลาดในโปรเจกต์ React TypeScript พร้อมวิธีตั้งค่า Environment Variables ให้ปลอดภัย

1 month ago 8 นาที
22 views
React TypeScript Workshop: จัดการ State, Form และ API ให้ปลอดภัยแบบมือโปร
React TypeScript

React TypeScript Workshop: จัดการ State, Form และ API ให้ปลอดภัยแบบมือโปร

เรียนรู้วิธีเขียน React ด้วย TypeScript ให้โค้ดสะอาดและลดบั๊ก ตั้งแต่การจัดการ Form ด้วย React Hook Form ไปจนถึงการดึงข้อมูล API และทำ Global State แบบ Type Safe

1 month ago 8 นาที
24 views
React TypeScript Workshop: เริ่มต้นเขียนโค้ดแบบมือโปรด้วย Type-First Architecture
React TypeScript

React TypeScript Workshop: เริ่มต้นเขียนโค้ดแบบมือโปรด้วย Type-First Architecture

อยากเขียน React ให้เก่งและบั๊กน้อยลงไหม? มาเรียนรู้วิธีวางโครงสร้างข้อมูล (Type-First) และสร้าง UI Component ที่นำกลับมาใช้ใหม่ได้จริง

1 month ago 7 นาที
23 views