ฟังก์ชันใน TypeScript
บทความนี้อธิบายเกี่ยวกับฟังก์ชันใน TypeScript
YouTube Video
ฟังก์ชันใน TypeScript
ฟังก์ชันใน TypeScript คือฟังก์ชันของ JavaScript ที่มีการเพิ่มการกำหนดประเภทของข้อมูล ใน TypeScript คุณสามารถเขียนโค้ดที่มีความทนทานมากขึ้นได้โดยการกำหนดประเภทของข้อมูลสำหรับอินพุต (พารามิเตอร์) และผลลัพธ์ (ค่าที่คืน) อย่างชัดเจนในฟังก์ชัน ด้านล่างนี้ เราจะแนะนำวิธีการพื้นฐานในการกำหนดฟังก์ชันและลักษณะบางอย่างของฟังก์ชันใน TypeScript
การกำหนดฟังก์ชันพื้นฐาน
1function add(x: number, y: number): number {
2 return x + y;
3}
4
5console.log(add(5, 10)); // 15
- ฟังก์ชัน
add
รับอาร์กิวเมนต์สองตัวที่เป็นประเภทnumber
และคืนค่าที่เป็นประเภทnumber
- มันรับอาร์กิวเมนต์สองตัว คือ
x
และy
ทั้งคู่เป็นประเภทnumber
โดยระบุประเภทอย่างชัดเจน - ประเภทผลลัพธ์ที่คืนค่าก็ถูกระบุเป็น
: number
ด้วยเช่นกัน
ฟังก์ชันไม่ระบุชื่อ (Function Expressions)
ฟังก์ชันไม่ระบุชื่อและฟังก์ชันแบบ Expression ก็สามารถใช้ใน TypeScript ได้เช่นกัน สามารถกำหนดประเภทของข้อมูลได้ในลักษณะเดียวกัน
1const multiply = function (x: number, y: number): number {
2 return x * y;
3};
4
5console.log(multiply(3, 4)); // 12
- คุณสามารถกำหนดฟังก์ชันนิรนามให้กับตัวแปรแล้วเรียกใช้ในภายหลังได้
1const factorial = function fact(n: number): number {
2 if (n <= 1) return 1;
3 return n * fact(n - 1); // Can call itself recursively
4};
5
6console.log(factorial(5)); // 120
- คุณสามารถใช้ฟังก์ชันนิพจน์ที่มีชื่อเพื่อให้สามารถเรียกซ้ำได้
ฟังก์ชันแบบลูกศร (Arrow Functions)
สามารถใช้การกำหนดประเภทของข้อมูลร่วมกับฟังก์ชันแบบลูกศรได้ด้วย
1const subtract = (x: number, y: number): number => {
2 return x - y;
3};
4
5console.log(subtract(10, 4)); // 6
โค้ดนี้กำหนดฟังก์ชันลูกศรชื่อ subtract
พร้อมคำอธิบายประเภทที่รับตัวเลขสองตัวเป็นอาร์กิวเมนต์และคืนค่าผลต่างของทั้งสองตัว
พารามิเตอร์แบบเลือกได้และค่าพารามิเตอร์เริ่มต้น
พารามิเตอร์สามารถกำหนดให้เป็นแบบเลือกได้หรือกำหนดค่าพารามิเตอร์เริ่มต้น
พารามิเตอร์แบบเลือกได้
การเพิ่ม ?
หลังจากชื่อพารามิเตอร์ทำให้พารามิเตอร์นั้นเป็นแบบเลือกได้
1function greet(name?: string): string {
2 return name ? `Hello, ${name}` : "Hello!";
3}
4
5console.log(greet()); // Hello!
6console.log(greet("Alice")); // Hello, Alice
โค้ดนี้รับอาร์กิวเมนต์ที่ไม่บังคับ หากมีอาร์กิวเมนต์จะทักทายโดยใช้ชื่อนั้น หากไม่มีจะทักทายโดยทั่วไป
ค่าพารามิเตอร์เริ่มต้น
คุณสามารถกำหนดค่าพารามิเตอร์เริ่มต้นได้เช่นกัน
1function greetWithDefault(name: string = "Guest"): string {
2 return `Hello, ${name}`;
3}
4
5console.log(greetWithDefault()); // Hello, Guest
6console.log(greetWithDefault("Bob")); // Hello, Bob
ฟังก์ชันนี้ใช้ค่าเริ่มต้นเป็น "Guest"
หากไม่มีการส่งอาร์กิวเมนต์มา และจะทักทายโดยใช้ชื่อที่ระบุหรือค่าดีฟอลต์
การกำหนดประเภทของฟังก์ชัน
คุณยังสามารถกำหนดประเภทของตัวฟังก์ชันได้เอง ตัวอย่างเช่น สิ่งนี้ใช้เมื่อมีการส่งฟังก์ชันเป็นอาร์กิวเมนต์
1type Operation = (x: number, y: number) => number;
2
3const addOperation: Operation = (x, y) => x + y;
4const multiplyOperation: Operation = (x, y) => x * y;
5
6console.log(addOperation(2, 3)); // 5
7console.log(multiplyOperation(2, 3)); // 6
โค้ดนี้กำหนดประเภทของฟังก์ชันชื่อ Operation
ที่รับตัวเลขสองตัวและคืนค่าตัวเลข จากนั้นนำไปสร้างและเรียกใช้ฟังก์ชันบวกและฟังก์ชันคูณ
เมื่อไม่มีค่าที่คืน (void
type)
สำหรับฟังก์ชันที่ไม่มีค่าที่คืนกลับมา ให้ระบุประเภท void
1function logMessage(message: string): void {
2 console.log(message);
3}
4
5logMessage("This is a message."); // This is a message.
โค้ดนี้กำหนดฟังก์ชัน logMessage
ที่มีประเภท void
รับข้อความที่เป็นสตริงและพิมพ์ออกที่คอนโซลโดยไม่มีค่าที่คืนกลับ
ฟังก์ชันคอลแบ็ก (Callback Function)
การส่งฟังก์ชันเป็นอาร์กิวเมนต์ไปยังฟังก์ชันอื่นและให้มันถูกเรียกใช้งานในภายหลัง เรียกว่า ฟังก์ชันคอลแบ็ก มักใช้ในกระบวนการแบบอะซิงโครนัสและการจัดการเหตุการณ์ (event handling) บ่อยครั้ง
1function processData(callback: (data: string) => void): void {
2 const data: string = "Processed Data";
3 callback(data);
4}
5
6processData((result: string): void => {
7 console.log(result);
8});
ในตัวอย่างนี้ ฟังก์ชันที่แสดงค่าบนคอนโซลถูกส่งเป็นฟังก์ชันคอลแบ็ก
หรืออีกทางเลือกหนึ่ง คุณสามารถกำหนดประเภทของคอลแบ็กโดยใช้ type
หรือ interface
1type Callback = (data: string) => void;
2
3function processData(callback: Callback): void {
4 const data: string = "Processed Data";
5 callback(data);
6}
7
8processData((result: string): void => {
9 console.log(result);
10});
การกำหนดประเภทของคอลแบ็กด้วย type
หรือ interface
ช่วยเพิ่มความสามารถในการนำกลับมาใช้ซ้ำ
ฟังก์ชันโอเวอร์โหลด
การโอเวอร์โหลดฟังก์ชันช่วยให้คุณสามารถกำหนดฟังก์ชันที่มีชื่อเดียวกันแต่มีรายการพารามิเตอร์ที่แตกต่างกันได้ ใน TypeScript คุณสามารถกำหนดฟังก์ชันหลายตัวที่มีชื่อเดียวกันและดำเนินการต่างๆ ตามประเภทและจำนวนของพารามิเตอร์
1// Overload Signature
2function double(value: number): number;
3function double(value: string): string;
4
5// Implementation Signature
6function double(value: number | string): number | string {
7 if (typeof value === "number") {
8 return value * 2;
9 } else if (typeof value === "string") {
10 return value + value;
11 }
12}
13
14console.log(double(10)); // 20
15console.log(double("Hello")); // HelloHello
ใน TypeScript การโอเวอร์โหลดทำได้ดังนี้:
-
ลายเซ็นการโอเวอร์โหลด
- กำหนดวิธีการใช้งานฟังก์ชัน (ลายเซ็นของมัน) โดยการเขียนสิ่งนี้หลายครั้ง จะทำให้โอเวอร์โหลดเป็นไปได้
-
ลายเซ็นการนำไปใช้
- นำฟังก์ชันตัวจริงไปใช้งาน ส่วนนี้ถูกกำหนดเพียงครั้งเดียวและจัดการทุกกรณีที่ระบุไว้ในลายเซ็นโอเวอร์โหลด
กฎสำหรับการโอเวอร์โหลด
กฎต่อไปนี้ใช้กับการโอเวอร์โหลดฟังก์ชัน:
-
ลำดับของการกำหนดลายเซ็นโอเวอร์โหลด
- เนื่องจากการประเมินผลทำจากบนลงล่าง จึงแนะนำให้กำหนดประเภทเฉพาะก่อน ตามด้วยประเภททั่วไป
-
ความเข้ากันได้ของลายเซ็นการนำไปใช้
- ลายเซ็นการนำไปปฏิบัติต้องเข้ากันได้กับอาร์กิวเมนต์และค่าที่ส่งคืนของลายเซ็นโอเวอร์โหลดทั้งหมด
-
ระบุรายละเอียดในลายเซ็นโอเวอร์โหลด
- ลายเซ็นการนำไปปฏิบัติมักจะคลุมเครือ ดังนั้นควรระบุรายละเอียดในลายเซ็นโอเวอร์โหลด
- หากกำหนดเพียงลายเซ็นการนำไปปฏิบัติ การอนุมานประเภทสำหรับฟังก์ชันจะไม่เพียงพอ
สรุป
ฟังก์ชันใน TypeScript มีลักษณะดังต่อไปนี้
- การระบุประเภท (Type Annotations)
- ด้วยการระบุประเภทของอาร์กิวเมนต์และค่าที่ส่งกลับ คุณจะเขียนโค้ดได้อย่างปลอดภัยมากขึ้น
- ฟังก์ชันนิรนามและฟังก์ชันลูกศร (Anonymous Functions and Arrow Functions)
- สามารถใช้งานได้เช่นเดียวกับใน JavaScript และการระบุประเภทจะช่วยเพิ่มความปลอดภัยของประเภทข้อมูล
- พารามิเตอร์ทางเลือกและค่าพารามิเตอร์เริ่มต้น (Optional and Default Parameters)
- คุณสามารถกำหนดอาร์กิวเมนต์ได้อย่างยืดหยุ่นตามความต้องการ
- การกำหนดประเภทของฟังก์ชัน (Function Type Definitions)
- กำหนดประเภทของฟังก์ชันโดยตรงเพื่อตรวจสอบประเภทข้อมูล
- ฟังก์ชันโอเวอร์โหลด (Function Overloading)
- คุณสามารถรองรับอาร์กิวเมนต์ที่แตกต่างกันด้วยชื่อฟังก์ชันเดียวกันได้
ด้วยการใช้สิ่งเหล่านี้ คุณสามารถเขียนโค้ดที่ชัดเจนและแข็งแกร่งยิ่งขึ้นใน TypeScript
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย