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) { ... }
