Kodokon kodokon.com

การอนุมานชนิด, any และ unknown

ให้ TypeScript หาชนิดข้อมูลด้วยการอนุมาน และเข้าใจว่าทำไม unknown จึงดีกว่า any ที่อันตราย

8 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

ข่าวดี: คุณไม่จำเป็นต้องระบุชนิดให้ทุกตัวแปร ด้วย การอนุมานชนิด (type inference) TypeScript หาชนิดของตัวแปรได้จากค่าที่คุณให้มัน เขียนแค่ let city = "Lyon" ก็เพียงพอ: TypeScript รู้ว่า city เป็น string และปกป้องมันราวกับว่าคุณได้ระบุชนิดไว้แล้ว

TYPESCRIPT
let city = "Lyon"; // inferred type: string
let count = 3;     // inferred type: number

count = count + 1; // accepted
// city = 42; -> error: city is still a string
ไม่มีการระบุชนิด แต่ชนิดข้อมูลก็อยู่ครบ

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

TYPESCRIPT
let data: any = "hello";
data = 42; // accepted without complaint

// Compiles, but crashes at runtime:
// data.toUpperCase() does not exist on a number!
ด้วย any, TypeScript หันไปมองทางอื่น

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

TYPESCRIPT
let value: unknown = "hello";

// console.log(value.toUpperCase()); -> rejected!

if (typeof value === "string") {
  console.log(value.toUpperCase()); // "HELLO"
}
unknown ต้องมีการตรวจสอบก่อนใช้งาน

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. การอนุมานชนิดคืออะไร?
    • TypeScript หาชนิดจากค่าเริ่มต้น
    • TypeScript ลบชนิดออกจากโปรแกรม
    • TypeScript แปลงตัวเลขเป็นข้อความ
  2. ทำไมจึงควรหลีกเลี่ยง any ให้มากที่สุด?
    • มันทำให้โปรแกรมช้าลง
    • มันปิดการตรวจสอบของ TypeScript
    • มันถูกห้ามโดยตัวภาษา
    • มันใช้ได้กับตัวเลขเท่านั้น
  3. คุณต้องทำอะไรก่อนใช้ค่าชนิด unknown?
    • ตรวจสอบชนิดของมัน เช่น ด้วย typeof
    • แปลงมันเป็น any
    • ประกาศมันเป็นครั้งที่สอง