ค้นหาเว็บไซต์

TypeScript แจ้งเตือนเกี่ยวกับตัวแปรที่ยังไม่ได้กำหนดค่าแม้จะมีคำสั่ง if/if else ครบถ้วน


พิจารณาตัวอย่างโค้ดนี้:

type MyType = "value1" | "value2"

function myFunction(myParam: MyType) {
  let myString: string
  if(myParam === "value1") {
    myString = "foo1"
  }
  else if(myParam === "value2") {
    myString = "foo2"
  }
  myOtherFunction(myString) 
}

function myOtherFunction(anotherParam: string) { ... }

เนื่องจาก if/if else จัดการค่าทั้งหมดของ myParam ดังนั้นจึงไม่มีทางที่ myString จะไม่ได้รับการกำหนดค่า อย่างไรก็ตาม TypeScript ก็ยังแจ้งเตือนว่า: Variable 'myString' is used before being assigned.

ฉันจะกำจัดข้อผิดพลาดนั้นโดยไม่ต้องเปลี่ยนแปลงโค้ดมากได้อย่างไร?

(แน่นอน ฉันสามารถลบส่วน if(myParam === "value2") ได้ แต่การทำเช่นนั้นจะทำให้โค้ดอ่านยากขึ้นมาก ฉันคิดว่า switch ก็ใช้ได้เช่นกัน แต่ฉันไม่ชอบมัน)

คำตอบ #1

วิธีที่จะ "แก้ไข" สิ่งนี้คือการใส่ else เพิ่มเติม

type MyType = "value1" | "value2"

function myFunction(myParam: MyType) {
  let myString: string
  if(myParam === "value1") {
    myString = "foo1"
  }
  else if(myParam === "value2") {
    myString = "foo2"
  }
  else {
    // const unknownType = myParam; // You can use this line to check what type is myParam
    throw new Error('myParam is wrong!');
  }

  // ...
}

โดยการเพิ่ม else เข้าไป คุณจะทำให้ TypeScript แน่ใจว่าทางที่ไม่ควรถูกเลือกจะไม่สามารถถูกเลือกได้จริง ๆ


สำหรับเรื่องแบบนี้เช่นกัน ผมมักจะใช้ switch เพื่อความชัดเจน แต่สามารถใช้ได้เฉพาะกับประเภทข้อมูลพื้นฐานเท่านั้น...

คำตอบ #2

โค้ด if .. else จะครอบคลุม เฉพาะ ก็ต่อเมื่อ else ตัวสุดท้าย ไม่มี if:

type MyType = "value1" | "value2"

function myFunction(myParam: MyType) {
  let myString: string
  if(myParam === "value1") {
    myString = "foo1"
  }
  else { // <-- no "if" here
    myString = "foo2"
  }

  // `myString` is definitely assigned a value here

  myOtherFunction(myString)
}

function myOtherFunction(anotherParam: string) { ... }