ตัวดำเนินการ Nullish Coalescing ใน TypeScript
ในบทความนี้ เราจะอธิบายตัวดำเนินการ Nullish Coalescing ใน TypeScript
YouTube Video
ตัวดำเนินการ Nullish Coalescing ใน TypeScript
ตัวดำเนินการ nullish coalescing (??
) ใน TypeScript คล้ายกับการตรวจสอบลัดใน JavaScript แต่ถูกใช้ในลักษณะที่ชัดเจนกว่าเพื่อให้ค่าเริ่มต้น (fallback) เฉพาะเมื่อด้านซ้ายเป็น null
หรือ undefined
ตัวดำเนินการนี้ช่วยให้คุณตรวจสอบค่าที่เป็น null
หรือ undefined
ได้ง่ายและตั้งค่าพื้นฐานตามที่ต้องการ
ตัวดำเนินการ nullish coalescing (??
) จะคืนค่าฝั่งขวาเมื่อฝั่งซ้ายเป็น null
หรือ undefined
เท่านั้น ซึ่งหมายความว่าค่าต่าง ๆ เช่น false
, สตริงว่าง, หรือเลข 0
จะไม่ถูกเปลี่ยนแปลง นี่เป็นความแตกต่างที่สำคัญจากตัวดำเนินการ OR แบบดั้งเดิม (||
) ตัวดำเนินการนี้ถูกเพิ่มใน TypeScript เวอร์ชัน 3.7
ไวยกรณ์พื้นฐาน
1let result = value ?? defaultValue;
value
: ค่าที่จะตรวจสอบว่าเป็น null หรือ undefined หรือไม่defaultValue
: ค่าที่จะคืนกลับหากvalue
เป็นnull
หรือundefined
ตัวอย่างการใช้งาน
1function getUserName(userName: string | null | undefined): string {
2 return userName ?? "Default User";
3}
4
5console.log(getUserName("Alice")); // Output: Alice
6console.log(getUserName(null)); // Output: Default User
7console.log(getUserName(undefined)); // Output: Default User
ในที่นี้ ฟังก์ชัน getUserName
จะคืนค่า "Default User"
หาก userName
เป็น null
หรือ undefined
มิฉะนั้นจะคืนค่าของ userName
ความแตกต่างจากตัวดำเนินการ OR
ตัวดำเนินการ OR จะถือว่าค่าต่าง ๆ เช่น false
, 0
, และ ""
(สตริงว่าง) เป็น "falsy" เช่นเดียวกับ null
และ undefined
ในทางกลับกัน ตัวดำเนินการ nullish coalescing ใช้เพียง null
และ undefined
สำหรับ fallback
ตัวอย่างของตัวดำเนินการ OR
1function getUserAge(age: number | null | undefined): number {
2 return age || 18; // `0` also applies the default value
3}
4
5console.log(getUserAge(25)); // Output: 25
6console.log(getUserAge(0)); // Output: 18
7console.log(getUserAge(null)); // Output: 18
ตัวอย่างของตัวดำเนินการ nullish coalescing
1function getUserAge(age: number | null | undefined): number {
2 return age ?? 18; // `0` does not apply the default value
3}
4
5console.log(getUserAge(25)); // Output: 25
6console.log(getUserAge(0)); // Output: 0
7console.log(getUserAge(null)); // Output: 18
การเลือกใช้งานระหว่างตัวดำเนินการ OR และตัวดำเนินการ nullish coalescing ขึ้นอยู่กับว่า 0
และสตริงว่างนั้นเป็นค่าที่ใช้งานได้หรือไม่ ตัวอย่างเช่น หากคุณต้องการเก็บอายุของผู้ใช้เป็น 0
คุณจำเป็นต้องใช้ตัวดำเนินการ nullish coalescing
การผสมผสานกับชนิดข้อมูล (Types)
คุณสามารถเพิ่มความแข็งแรงให้กับโค้ดของคุณได้ด้วยการใช้ข้อดีของความปลอดภัยของชนิดข้อมูลใน TypeScript ควบคู่กับตัวดำเนินการ nullish coalescing ในตัวอย่างต่อไปนี้ ค่าพื้นฐานจะถูกใช้เมื่อคุณสมบัติบางอย่างเป็น null
หรือ undefined
1interface User {
2 name: string;
3 age?: number | null;
4}
5
6function displayUserInfo(user: User): string {
7 const userName: string = user.name ?? "Anonymous";
8 const userAge: number = user.age ?? 18;
9 return `Name: ${userName}, Age: ${userAge}`;
10}
11
12const user1: User = { name: "John", age: null };
13const user2: User = { name: "Doe" };
14
15console.log(displayUserInfo(user1)); // Output: Name: John, Age: 18
16console.log(displayUserInfo(user2)); // Output: Name: Doe, Age: 18
- ในอินเตอร์เฟซ
User
ของ TypeScript,age
คือnumber | null
ซึ่งอนุญาตให้null
หรือundefined
เป็นค่าได้ - ฟังก์ชัน
displayUserInfo
จะคืนค่า"Anonymous"
หากname
เป็นnull
หรือundefined
และ18
หากage
เป็นnull
หรือundefined
สรุป
ตัวดำเนินการ nullish coalescing ช่วยตั้งค่าดีฟอลต์เมื่อค่าคือ null
หรือ undefined
เท่านั้น แตกต่างจากตัวดำเนินการ OR แบบดั้งเดิม ตัวดำเนินการนี้จะไม่ถือว่า false
, 0
, หรือสตริงว่างเป็น "falsy," ทำให้มีประโยชน์ในการเก็บค่าต่าง ๆ เหล่านี้ไว้ นอกจากนี้ การผสมผสานกับระบบชนิดของ TypeScript ทำให้สามารถสร้างโค้ดที่แข็งแกร่งและอ่านได้ง่ายขึ้น
ด้วยการใช้ตัวดำเนินการ nullish coalescing อย่างมีประสิทธิภาพ คุณสามารถเขียนลอจิกสำหรับการตั้งค่าเริ่มต้นได้อย่างกระชับ พร้อมทั้งลดการตรวจสอบ null
ที่ไม่จำเป็น
ตัวดำเนินการ Nullish Coalescing Assignment ใน TypeScript
ตัวดำเนินการ nullish coalescing assignment (??=
) เป็นตัวดำเนินการใหม่ล่าสุดที่ถูกนำมาใช้ใน TypeScript ซึ่งช่วยให้สามารถกำหนดค่าได้สะดวกเมื่อค่าของตัวแปรเป็น null
หรือ undefined
เท่านั้น ที่นี่ เราจะอธิบายวิธีการทำงานของตัวดำเนินการนี้ สถานการณ์ที่มันมีประสิทธิภาพ และให้ตัวอย่างพร้อมโค้ด
ตัวดำเนินการ Nullish Coalescing Assignment คืออะไร
ตัวดำเนินการกำหนดค่า nullish coalescing assignment operator เป็นตัวดำเนินการกำหนดค่าที่อิงกับตัวดำเนินการ nullish coalescing ตัวดำเนินการนี้ใช้สำหรับกำหนดค่าทดแทนใหม่เฉพาะกรณีที่ค่าของตัวแปรเป็น null
หรือ undefined
1let variable: string | null = null;
2variable ??= "Default Value"; // The variable is null, so the new value is assigned
3console.log(variable); // Output: "Default Value"
ด้วยการใช้ตัวดำเนินการนี้ คุณสามารถเขียนลอจิก "กำหนดค่าเมื่อค่าตัวแปรเป็น undefined หรือ null" ได้กระชับมากยิ่งขึ้น
การเปรียบเทียบกับวิธีการกำหนดค่าแบบดั้งเดิม
หากไม่มีตัวดำเนินการ nullish coalescing assignment operator คุณจะต้องใช้คำสั่ง if
หรือตัวดำเนินการ ternary เพื่อให้ได้พฤติกรรมเดียวกัน ลองเปรียบเทียบกับวิธีการกำหนดค่าแบบดั้งเดิม
วิธีการแบบดั้งเดิม
1let variable: string | null = null;
2if (variable === null || variable === undefined) {
3 variable = "Default Value";
4}
5console.log(variable); // Output: "Default Value"
วิธีการที่ใช้ตัวดำเนินการแบบเทอร์นารี
1let variable: string | null = null;
2variable = variable ?? "Default Value";
3console.log(variable); // Output: "Default Value"
วิธีการแบบย่อที่ใช้ตัวดำเนินการ ??=
1let variable: string | null = null;
2variable ??= "Default Value";
3console.log(variable); // Output: "Default Value"
ตัวดำเนินการ nullish coalescing assignment operator ใช้งานง่ายและอ่านเข้าใจกว่าการกำหนดค่าในวิธีอื่น ๆ ทำให้โค้ดอ่านง่ายขึ้น
ตัวอย่างเฉพาะของการใช้ ??=
ตัวดำเนินการ nullish coalescing assignment operator มีประโยชน์ในหลายสถานการณ์ เช่น การกำหนดค่าเริ่มต้นให้กับคุณสมบัติของวัตถุและการตั้งค่าดีฟอลต์ นี่คือตัวอย่างเฉพาะบางประการ
การกำหนดค่าเริ่มต้นของคุณสมบัติออบเจ็กต์
1interface Config {
2 theme?: string;
3 language?: string;
4}
5
6let config: Config = {};
7config.theme ??= "light"; // Set the default "light" theme if none is specified
8config.language ??= "en"; // Set the default "en" language if none is specified
9
10console.log(config); // Output: { theme: "light", language: "en" }
การกำหนดค่าเริ่มต้นของอาเรย์
1let numbers: number[] | null = null;
2numbers ??= []; // Assign an empty array if numbers is null
3
4numbers.push(1);
5console.log(numbers); // Output: [1]
การตั้งค่าค่าเริ่มต้นสำหรับอาร์กิวเมนต์ของฟังก์ชัน
1function greet(name?: string) {
2 name ??= "Guest"; // Set name to "Guest" if it is undefined or null
3 console.log(`Hello, ${name}!`);
4}
5
6greet(); // Output: "Hello, Guest!"
7greet("Alice"); // Output: "Hello, Alice!"
บันทึกและข้อจำกัด
ตัวดำเนินการ nullish coalescing assignment operator มีประโยชน์มาก แต่มีข้อควรระวังบางประการ
- ใช้ได้เฉพาะกับ
null
และundefined
: ตัวดำเนินการนี้จะกำหนดค่าเฉพาะเมื่อค่าที่ได้รับเป็นnull
หรือundefined
เช่น สตริงว่าง (""
),0
, และfalse
จะไม่ถูกกำหนดค่า
1let str: string | null = "";
2str ??= "Default";
3console.log(str); // Output: "" (remains an empty string)
4
5let num: number | undefined = 0;
6num ??= 100;
7console.log(num); // Output: 0 (remains 0)
- การใช้งานร่วมกับตัวดำเนินการอื่น: การใช้ nullish coalescing assignment operator ร่วมกับตัวดำเนินการอื่นอาจส่งผลลัพธ์ที่ไม่คาดคิด เป็นสิ่งสำคัญอย่างยิ่งที่ต้องเข้าใจความแตกต่างระหว่างมันกับตัวดำเนินการกำหนดค่า OR
1let value: string | null = null;
2value ||= "Default"; // Targets not only "null" and "undefined" but also falsy values
3console.log(value); // Output: "Default"
4
5value = "";
6value ||= "Default"; // An empty string is also targeted
7console.log(value); // Output: "Default"
8
9value = null;
10value ??= "Default"; // Targets only null or undefined
11console.log(value); // Output: "Default"
โค้ดตัวอย่าง
1let config: { theme?: string; language?: string } = {};
2
3// Use Nullish Coalescing Assignment to set default values
4config.theme ??= "light";
5config.language ??= "en";
6
7console.log(config); // Output: { theme: "light", language: "en" }
8
9let list: number[] | null = null;
10list ??= [];
11list.push(42);
12
13console.log(list); // Output: [42]
ด้วยการใช้ nullish coalescing assignment operator คุณสามารถลดโค้ดที่ไม่จำเป็นและเขียน TypeScript โค้ดที่ลื่นไหลและสวยงามยิ่งขึ้น
สรุป
ตัวดำเนินการกำหนดค่าแบบ nullish coalescing (??=
) เป็นหนึ่งในการดำเนินการกำหนดค่าที่เรียบง่ายและมีประสิทธิภาพใน TypeScript มันมีประโยชน์อย่างยิ่งเมื่อคุณต้องการตรวจสอบค่า null
หรือ undefined
ขณะตั้งค่าค่าเริ่มต้น เมื่อเปรียบเทียบกับคำสั่ง if
แบบดั้งเดิมหรือตัวดำเนินการ ternary จะทำให้โค้ดกระชับและอ่านง่ายขึ้น และควรนำมาใช้ในกระบวนการพัฒนาในอนาคตอย่างจริงจัง
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย