ฟังก์ชัน ในภาษา TypeScript

23 January 2022

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

  • ฟังก์ชันในภาษา TypeScript
  • การประกาศฟังก์ชัน
  • การส่งค่ากลับของฟังก์ชัน
  • ประเภทข้อมูลของฟังก์ชัน
  • ฟังก์ชันวาดต้นคริสต์มาส

ฟังก์ชันในภาษา TypeScript

ฟังก์ชัน (Function) คือส่วนของโปรแกรมที่ถูกกำหนดโดยรวมหลายคำสั่งเข้าด้วยกันเพื่อทำงานบางอย่าง ฟังก์ชันสามารถรับค่านำเข้าเพื่อนำมาคำนวณและส่งค่ากลับเมื่อทำงานเสร็จสิ้นได้ การสร้างฟังก์ชันทำให้เราสามารถนำมันกลับมาใช้ซ้ำได้ในโปรแกรมจากการเรียกใช้ฟังก์ชัน และนี่เองเป็นแนวคิดของการเขียนโปรแกรมแบบ Functional

นี่เป็นรูปแบบการประกาศฟังก์ชันในภาษา TypeScript

function fnName(parameters): void {
    // statements
}

ในการประกาศฟังก์ชันจะใช้คำสั่ง function ตามด้วยรายการพารามิเตอร์ของฟังก์ชันภายในวงเล็บ () คั่นแต่ละพารามิเตอร์ด้วยเครื่องหมายคอมมา (,) พารามิเตอร์อาจจะไม่มีก็ได้ ภายในบล็อคของฟังก์ชันประกอบไปด้วยคำสั่งของของโปรแกรมเพื่อทำงาน นอกจากนี้ ฟังก์ชันยังสามารถมีการส่งค่ากลับได้

function fnName(parameters): returnType {
    // statements
    return value;
}

ในกรณีที่ฟังก์ชันมีการส่งค่ากลับ ให้ระบุประเภทข้อมูลที่ต้องการส่งกลับ returnType ถัดจากพารามิเตอร์หลังเครื่องหมายโคลอน (:) และใช้คำสั่ง return สำหรับส่งค่ากลับ โดยคำสั่ง return นั้นเป็นเหมือนคำสั่งที่ใช้เพื่อจบการทำงานของฟังก์ชัน

สำหรับฟังก์ชันที่มีประเภทข้อมูลการส่งค่ากลับที่เป็น void เหมือนกับในรูปแบบแรก หมายความว่าฟังก์ชันดังกล่าวไม่มีการส่งค่ากลับ

การประกาศฟังก์ชัน

หลังจากที่คุณได้เห็นวิธีการประกาศฟังชันในภาษา TypeScript ไปแล้ว ต่อไปเรามาลองสร้างฟังก์ชันแรกเพื่อใช้งานในโปรแกรมกัน นี่เป็นฟังก์ชันสำหรับกล่าวคำทักทายชื่อที่ส่งเข้ามายังฟังก์ชันออกทางหน้าจอ

greeting.ts
function greet(name: string): void {
    console.log(`Hi ${name}.`);
}

greet("Matteo");
greet("TypeScript");

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Hi Matteo.
Hi TypeScript.

ในตัวอย่างนี้ เราได้ประกาศฟังชันที่มีชื่อว่า greet ฟังก์ชันนี้รับหนึ่งพารามิเตอร์ที่มีประเภทข้อมูลเป็น String ซึ่งเป็นชื่อที่จะถูกส่งเข้ามายังฟังก์ชันสำหรับกล่าวคำทักทายออกทางหน้าจอ จากนั้นเราได้เรียกใช้งานฟังก์ชันสองครั้งด้วยชื่อของฟังก์ชัน

greet("Matteo");
greet("TypeScript");

ในการเรียกใช้งานฟังก์ชัน เราระบุอาร์กิวเมนต์ที่สอดคล้องกับพารามิเตอร์ของฟังก์ชัน เนื่องจากฟังก์ชันนี้กำหนดหนึ่งพารามิเตอร์ที่เป็น String ดังนั้นเราจะส่งอาร์กิวเมนต์ที่เป็น String เช่นเดียวกันสำหรับฟังก์ชันเพื่อทำงาน

เมื่อมีการเรียกใช้งานฟังก์ชัน การทำงานในส่วนของโปรแกรมหลักจะย้ายไปทำงานในฟังก์ชัน จนกว่าฟังก์ชันจะทำงานเสร็จ โค้ดในส่วนของโปรแกรมหลักจึงจะทำงานคำสั่งถัดไปได้

ฟังก์ชันอาจจะมีพารามิเตอร์หรือไม่ก็ได้ ถ้าหากฟังก์ชันไม่มีพารามิเตอร์ เราแค่ปล่อยให้วงเล็บว่างเปล่าทั้งในตอนที่ประกาศและตอนเรียกใช้งานฟังก์ชัน นี่เป็นฟังก์ชันสำหรับแสดงเวลาปัจจุบันบนคอมพิวเตอร์ของคุณที่ปราศจากพารามิเตอร์

clock.ts
function currentTime(): void {
    let date = new Date();
    console.log(date.toUTCString());
}

currentTime();

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Fri, 17 Dec 2021 21:14:43 GMT

ในตัวอย่างนี้ เราได้ประกาศฟังก์ชัน currentTime ซึ่งเป็นฟังก์ชันที่ไม่มีพารามิเตอร์ ฟังก์ชันนี้ใช้สำหรับแสดงเวลาปัจจุบันออกทางหน้าจอ หรือกล่าวอีกนัยหนึ่ง มันเป็นนาฬิกาบอกเวลาของเรานั่นเอง เราสร้างออบเจ็คของวันที่จากคลาส Date เพื่อรับเอาเวลาปัจจุบันบนคอมพิวเตอร์ และเรียกใช้เมธอด toUTCString บนออบเจ็คสำหรับแสดงวันที่ในรูปแบบ UTC

การส่งค่ากลับของฟังก์ชัน

ฟังก์ชันที่ไม่มีการส่งค่ากลับมักจะจบการทำงานในตัวมันเอง ในทางตรงกันข้าม เราสามารถส่งค่ากลับจากฟังก์ชันไปยังจุดที่เรียกใช้งานได้ ต่อไปมาสร้างฟังก์ชันสำหรับบวกสองตัวเลขเข้าด้วยกันและส่งค่ากลับเป็นผลลัพธ์ของการบวก นี่เป็นตัวอย่าง

sum.ts
function add(a: number, b: number): number {
    return a + b;
}

let x: number = add(1, 2);
let y: number = add(5, 4);
console.log(`1 + 2 = ${x}`);
console.log(`5 + 4 = ${y}`);

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

1 + 2 = 3
5 + 4 = 9

ในตัวอย่างนี้ เป็นโปรแกรมบวกเลขอย่างง่าย เราได้ประกาศฟังก์ชัน add ซึ่งรับสองพารามิเตอร์ที่เป็นตัวเลขเพื่อนำมาหาผลรวม จากนั้นเราใช้คำสั่ง return เพื่อส่งค่าผลรวมของตัวเลขทั้งสองเป็นค่าส่งกลับของฟังก์ชัน

let x: number = add(1, 2);
let y: number = add(5, 4);

จากนั้นเรียกใช้งานฟังก์ชันและเก็บผลลัพธ์ไว้ในตัวแปร x และ y เพื่อนำมาแสดงผลออกทางหน้าจอ จะเห็นว่าเราสามารถเรียกใช้ฟังก์ชันได้หลายครั้งจากการประกาศเพียงครั้งเดียว หากปราศจากฟังก์ชัน เราจะต้องเขียนคำสั่งสำหรับบวกในแต่ละตัวแปรทุกครั้ง ยกตัวอย่างเช่น

let x: number = 1 + 2;
let y: number = 5 + 4;

นี่คงจะเป็นเรื่องที่ไม่สะดวกมากนักถ้าหากเราต้องการทำอะไรที่มากกว่าการบวก สำหรับงานบางอย่างที่มีคำสั่งการทำงานเป็นจำนวนมาก การกำหนดมันไว้ในฟังก์ชันจะทำให้โค้ดถูกแบ่งออกเป็นส่วนๆ และสามารถนำมาใช้ซ้ำในโปรแกรมได้ง่าย

ต่อไปมาดูตัวอย่างเพิ่มเติมสำหรับการคำนวณทางคณิตศาสตร์ มาเขียนฟังก์ชันสำหรับหาค่า ห.ร.ม ของสองตัวเลข โดยนิยามของ ห.ร.ม คือตัวเลขที่มากที่สุดที่สามารถหารตัวเลขทั้งสองได้ลงตัว นี่เป็นตัวอย่างของโปรแกรม

gcd.ts
function gcd(a: number, b: number): number {
    let gcd: number;
    let min: number;
    if (a < b) {
        min = a;
    } else {
        min = b;
    }

    for (let i = 1; i <= min; i++) {
        if (a % i == 0 && b % i == 0) {
            gcd = i;
        }
    }
    return gcd;
}

console.log(`GCD of 8 and 12 is ${gcd(8, 12)}`);
console.log(`GCD of 34 and 51 is ${gcd(34, 51)}`);

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

GCD of 8 and 12 is 4
GCD of 34 and 51 is 17

ในตัวอย่างนี้ เราได้ประกาศฟังก์ชัน gcd สำหรับหาค่า ห.ร.ม ของสองตัวเลขที่ส่งเป็นพารามิเตอร์ของฟังก์ชัน โดยฟังก์ชันส่งค่ากลับเป็น ห.ร.ม ของตัวเลขที่หาได้ เนื่องจากการคำสั่งสำหรับการหา ห.ร.ม นั้นมีเป็นจำนวนมาก มันจึงเหมาะสมเป็นอย่างยิ่งในการประกาศเป็นฟังก์ชันเพื่อเรียกใช้งาน ต่อไปมาดูว่าโค้ดในฟังก์ชันทำงานอย่างไร

let min: number;
if (a < b) {
    min = a;
} else {
    min = b;
}

เนื่องจาก ห.ร.ม ของสองตัวเลขเป็นตัวเลขที่ใหญ่ที่สุดที่หารตัวเลขทั้งสองลงตัว แต่จะไม่เกินค่าที่น้อยกว่า ดังนั้นเราค้นหาตัวเลขที่น้อยกว่าจากสองพารามิเตอร์เก็บไว้ในตัวแปร min นั่นหมายความว่างานของเราคือหาตัวเลขที่มากที่สุดระหว่าง 1 ถึง min ที่หารทั้ง a และ b ลงตัว

for (let i = 1; i <= min; i++) {
    if (a % i == 0 && b % i == 0) {
        gcd = i;
    }
}

จากนั้นเราใช้คำสั่ง for loop ในการค้นหาตัวเลขจาก 1 ถึง min หากพบว่าตัวเลขทั้งสองสามารถหารด้วย i ลงตัว จะถือว่านี่เป็น ห.ร.ม ของตัวเลข และเมื่อจบการทำงานของลูปเราจะได้รับค่า ห.ร.ม เก็บไว้ในตัวแปร gcd และส่งเป็นค่ากลับของฟังก์ชัน

จะเห็นว่าในการใช้งานฟังก์ชัน เราสามารถรวบรวมชุดคำสังเพื่อแก้ปัญหาบางอย่างเข้าด้วยกัน และนำฟังก์ชันมาเรียกใช้งานได้ไม่จำกัด นี่เป็นแนวคิดที่สำหรับที่สุดในการเขียนโปรแกรมแบบ Functional

ในการใช้งานคำสั่ง return นั้นไม่จำเป็นต้องทำในตอนท้ายของฟังก์ชันเสมอไป คุณสามารถส่งค่ากลับที่ไหนก็ได้ในฟังก์ชันและในหนึ่งฟังก์ชันอาจมีการส่งกลับได้มากกว่าหนึ่งที่ นี่เป็นตัวอย่างของโปรแกรมคำนวณหาค่าแฟกทอเรียลของตัวเลขจำนวนเต็ม n ซึ่งแฟกทอเรียลคือผลคูณกันตั้งแต่ 1 ถึง n และเราจะนำมันมาเขียนเป็นฟังก์ชัน

factorial.ts
function fac(n: number): number {
    if (n == 0) {
        return 1;
    }
    let sum: number = 1;
    for (let i = 1; i <= n; i++) {
        sum = sum * i;
    }
    return sum;
}

console.log(`0! = ${fac(0)}`);
console.log(`5! = ${fac(5)}`);

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

0! = 1
5! = 120

จากตัวอย่างเป็นการประกาศฟังก์ชัน fac สำหรับหาค่าแฟกทอเรียลของพารามิเตอร์ที่ส่งเข้ามายังฟังก์ชัน เนื่องจากเราทราบว่าค่าของ 0! นั้นเท่ากับหนึ่งโดยนิยาม ดังนั้นเราสามารถใช้คำสั่ง return เพื่อส่งค่ากลับได้ทันที นี่จะทำให้ฟังก์ชันจบการทำงานโดยที่ไม่ต้องทำส่วนอื่นต่อ

ในกรณีที่ค่าของตัวเลขไม่เท่ากับ 0 โปรแกรมจะทำการคำนวณหาค่าแฟกทอเรียลจากคำสั่ง for loop ด้านล่าง เพื่อนำตัวเลขจาก 1 ถึง n มาคูณกัน และส่งค่ากลับเมื่อการทำงานเสร็จสิ้น จะเห็นว่าเราสามารถใช้คำสั่ง return เพื่อส่งค่ากลับจากส่วนไหนก็ได้เมื่อต้องการ

นั่นหมายความว่าเมื่อคำสั่ง return ในฟังก์ชัน เป็นการสั่งให้ฟังก์ชันส่งค่ากลับและจบการทำงาน และโปรแกรมจะย้อนกลับไปทำงานยังส่วนที่เรียกใช้ฟังก์ชันต่อไป

ประเภทข้อมูลของฟังก์ชัน

ในภาษา TypeScript นั้นฟังก์ชันมีประเภทข้อมูลเป็น Function ซึ่งนี่สามารถนำไปใช้ได้กับฟังก์ชันทุกรูปแบบในภาษา TypeScript กล่าวคือฟังก์ชันที่มีพารามิเตอร์และการส่งค่ากลับ (พร้อมทั้งประเภทข้อมูล) เป็นแบบไหนก็ได้ นี่เป็นตัวอย่างการประกาศตัวแปรสำหรับเก็บฟังก์ชัน

function sayHi(name: string): void {
    console.log(`Hi ${name}.`);
}

let myFunction: Function = sayHi;
myFunction("David");

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Hi David.

ในตัวอย่างนี้ เราได้ประกาศตัวแปร myFunction สำหรับเก็บค่าของฟังก์ชัน sayHi ที่ถูกประกาศไปก่อนหน้า เนื่องจากตัวแปรนี้เก็บค่าของฟังก์ชัน ดังนั้นเราสามารถใช้มันเหมือนกับฟังก์ชันได้ทุกประการ เช่น การนำมาเรียกใช้งาน เป็นต้น

นอกจากนี้ ค่าของฟังก์ชันสามารถเป็นฟังก์ชัน Expression หรือ Arrow function ได้ ซึ่งนี่ก็เป็นอีกรูปแบบของการประกาศฟังก์ชันในภาษา TypeScript ยกตัวอย่างเช่น

let fn1: Function = function (name: string): void {
    console.log(`Hi ${name}.`);
};

let fn2: Function = (name: string): void => {
    console.log(`Hello ${name}.`);
};

ในตัวอย่าง ทั้งฟังก์ชัน Expression และ Arrow function เป็นฟังก์ชันที่ถูกสร้างในขณะที่โปรแกรมทำงาน และจะต้องสร้างก่อนการนำไปใช้งาน และมันเป็นฟังก์ชันที่สามารถใช้กับประเภทข้อมูล Function ได้

ต่อไปนี้เป็นฟังก์ชันที่มีพารามิเตอร์และประเภทข้อมูลในรูปแบบต่างๆ ที่ถูกประกาศในรูปแบบของฟังก์ชัน Expression

let add: Function = function (a: number, b: number): number {
    return a + b;
};

let lengthOfString: Function = function (str: string): number {
    return str.length;
};

ในตัวอย่างนี้ ทั้งตัวแปร add และ lengthOfString ถูกประกาศให้มีประเภทข้อมูลเป็น Function ซึ่งมีการเก็บฟังก์ชันที่มีจำนวนพารามิเตอร์ ประเภทข้อมูลของพารามิเตอร์ และการส่งค่ากลับที่แตกต่างกัน ดังนั้นจะสามารถกล่าวได้ว่ามันเป็นประเภทข้อมูลทั่วไปของทุกฟังก์ชันในภาษา TypeScript

เนื่องจากภาษา TypeScript ถูกออกแบบมาให้เข้มงวดในเรื่องประเภทข้อมูล ดังนั้นเราสามารถใช้คำสั่ง type ในการกำหนดประเภทข้อมูลให้กับฟังก์ชันเพื่อให้มีรูปแบบของพารามิเตอร์และการส่งค่ากลับในแบบที่ต้องการได้

ในตัวอย่างต่อไป มาสร้างประเภทข้อมูลของฟังชันที่รับพารามิเตอร์เป็นสองตัวเลข และส่งค่ากลับเป็นตัวเลขด้วยคำสั่ง type ในภาษา TypeScript กัน นี่เป็นตัวอย่าง

type mathFn = (a: number, b: number) => number;

const add: mathFn = function (a: number, b: number): number {
    return a + b;
}

const subtract: mathFn = function (a: number, b: number): number {
    return a - b;
}

ในตัวอย่างนี้ เราได้สร้างประเภทข้อมูลสำหรับฟังก์ชันที่มีชื่อว่า mathFn โดยมันมีสองพารามิเตอร์ที่เป็นตัวเลขและส่งค่ากลับเป็นตัวเลข จากนั้นนำมันไปใช้เป็นประเภทข้อมูลสำหรับสองฟังก์ชัน add และ subtract นั่นหมายความว่าฟังก์ชันเหล่านี้จะต้องมีสองพารามิเตอร์ที่เป็นตัวเลขและส่งค่ากลับเป็นตัวเลขเช่นเดียวกันกับประเภทข้อมูลของมัน

จะเห็นว่าการประกาศประเภทข้อมูลด้วยคำสั่ง type ทำให้เราสามารถควบคุมโครงสร้างของฟังก์ชัน และนำประเภทข้อมูลนั้นกลับมาใช้ใหม่ได้ ซึ่งนี่เป็นสิ่งที่ดีเมื่อหลายฟังก์ชันต้องการแบ่งปันโครงสร้างที่เหมือนกัน เช่น มันอาจนำไปใช้กับฟังก์ชันสำหรับการคูณและการหารได้อีก เป็นต้น

ฟังก์ชันวาดต้นคริสต์มาส

สำหรับตัวอย่างสุดท้ายในการใช้งานฟังก์ชัน เนื่องจากตอนนี้ใกล้จะถึงเทศกาลคริสต์มาสแล้ว เรามาเขียนโปรแกรมสำหรับวาดรูปต้นคริสต์มาสกัน นี่เป็นตัวอย่างของโปรแกรมที่ทุกคนสามารถสร้างต้นคริสมาสต์ของพวกเขาได้

christmas_tree.ts
function drawTrunk(treeHeight: number): void {
    let treeWidth: number = treeHeight * 2;
    let halfCol = Math.floor(treeWidth / 2);

    // trunk's height by 30 percent of the tree
    let trunkHeight: number = Math.floor(treeHeight * 0.3);
    // trunk's width by 8 percent of the tree
    let trunkWidth: number = Math.floor(treeWidth * 0.08);

    for (let i = 0; i < trunkHeight; i++) {
        let row: string = "";
        for (let j = 0; j < treeWidth; j++) {
            if (j >= halfCol - trunkWidth && j <= halfCol + trunkWidth) {
                row += "T";
            } else {
                row += " ";
            }
        }
        console.log(row);
    }
}

function drawTree(height: number): void {
    let width: number = height * 2;
    let halfCol = Math.floor(width / 2);

    for (let i = 0; i < height; i++) {
        let row: string = "";
        for (let j = 0; j < width; j++) {
            if (j >= halfCol - i - 1 && j <= halfCol + i) {
                let r = Math.random();
                // draw decoration stuff by 30 percent
                if (r <= 0.1) {
                    row += "*";
                } else if (r <= 0.2) {
                    row += "x";
                } else if (r <= 0.3) {
                    row += "+";
                } else {
                    // draw the leave
                    row += "C";
                }
            } else {
                row += " ";
            }
        }
        console.log(row);
    }
    drawTrunk(height);
}

console.log("Christopher's Christmas Tree");
drawTree(10);

console.log("\nEmily's Christmas Tree");
drawTree(8);

console.log("\nRebecca's Christmas Tree");
drawTree(6);

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Christopher's Christmas Tree
         +C
        CCxC
       CC+**C
      CCC*xCCC
     CC+CC*CCCC
    C*xCCC+CCCC*
   +CC*CCC+++CC*+
  C+CxCCCCCCxCC++*
 *CCC*CCC+CCCCCC+C*
CCxCCC+CCCCCCxCCCCCC
         TTT
         TTT
         TTT

Emily's Christmas Tree
       ++
      +CxC
     CCC+CC
    **+*CC++
   *CC**Cx+*C
  xCCCCCCCCCCC
 *CC*+CC*C+CCCC
CCCx+C*Cx+CCC*CC
       TTT
       TTT

Rebecca's Christmas Tree
     CC
    CC+x
   CCxCx+
  CCx+*CCC
 CCCCCCCCCC
CCxCCCCCCCC+
      T

ในตัวอย่างนี้ เป็นโปรแกรมสำหรับวาดรูปต้นคริสมาสต์ลงบนหน้าจอ (Terminal) เราได้ประกาศฟังก์ชัน drawTree ซึ่งเป็นฟังก์ชันสำหรับการทำงานทั้งหมด โดยมันรับพารามิเตอร์เป็นความสูงของต้นคริมมาสต์ที่ต้องการวาด และไม่มีการส่งค่ากลับเนื่องจากการทำงานทั้งหมดเสร็จสิ้นภายในฟังก์ชัน ต่อไปเป็นการอธิบายการทำงานของโปรแกรมในแต่ละขั้นตอน

let width: number = height * 2;
let halfCol = Math.floor(width / 2);

ในตอนแรกที่ฟังก์ชันเริ่มทำงาน เราคำนวณหาความกว้างของต้นคริสมาสต์โดยใช้มันเป็นสองเท่าของความสูงและเก็บไว้ในตัวแปร width และหาจุดกึ่งกลางของลำต้นโดยนำความกว้างไปหารด้วย 2 เก็บไว้ในตัวแปร halfCol

for (let i = 0; i < height; i++) {
    ...
    for (let j = 0; j < width; j++) {
        ...
    }
}

จากนั้นเราใช้คำสั่ง for loop แบบซ้อนกันในการวาดส่วนใบของต้นคริสมาสต์ โดยลูปด้านนอกจะควบคุมความสูงของต้นไม้ และลูปด้านในควบคุมความกว้าง คุณสามารถจินตนาการได้ว่านี่คือการสร้างตารางขนาด height * width ที่เราจะวาดตัวอักษรลงไป

if (j >= halfCol - i - 1 && j <= halfCol + i) {
    let r = Math.random();
    // draw decoration stuff by 30 percent
    if (r <= 0.1) {
        row += "*";
    } else if (r <= 0.2) {
        row += "x";
    } else if (r <= 0.3) {
        row += "+";
    } else {
        // draw the leave
        row += "C";
    }
} else {
    row += " ";
}

นี่เป็นการกำหนดเงื่อนไขในการวาดส่วนใบของต้นคริสมาสต์ เพื่อค้นหาพื้นที่ของใบที่สามารถวาดได้ เราใช้เงื่อนไข j >= halfCol - i - 1 && j <= halfCol + i ซึ่งหมายความว่าใบจะถูกเริ่มวาดจากกึ่งกลางของลำต้น halfCol และขยับไปทางซ้าย (- i - 1) และทางด้านขวา (+ i) ตามจำนวนแถวที่เพิ่มขึ้นโดยตัวแปร i

นอกจากนี้ เราได้สุ่มเครื่องประดับสำหรับตกแต่งใบเป็นจำนวน 30 เปอร์เซ็นของพื้นที่สำหรับวาดใบทั้งหมด โดยการใช้เมธอด Math.random() สำหรับสุ่มตัวเลขที่จะให้ค่าระหว่าง 0 ถึง1 (แบบไม่รวม) และนี่ถือว่าเป็นการเสร็จสิ้นการวาดใบของต้นไม้

drawTrunk(height);

เมื่อวาดใบเสร็จแล้วเรายังขาดอีกสิ่งหนึ่งที่จะต้องวาดนั่นคือลำต้น แทนที่จะวาดลำต้นในฟังก์ชันเดียวกัน เราสร้างฟังก์ชัน drawTrunk สำหรับวาดลำต้นโดยเฉพาะ ดังนั้นเมื่อวาดใบเสร็จแล้วเราเรียกฟังก์ชันนี้ต่อสำหรับวาดลำต้น

Note: ในส่วนนี้คุณจะเห็นว่าฟังก์ชันสามารถเรียกใช้ฟังก์ชันอื่นได้ นี่เป็นรูปแบบการทำงานพื้นฐานของฟังก์ชัน การทำงานทำงานของฟังก์ชันจะเป็นแบบ Stack ฟังก์ชันที่ถูกเรียกใช้ภายในฟังก์ชันอื่นจะทำงานให้เสร็จก่อน ก่อนที่ฟังก์ชันหลักจะทำงานได้ต่อ

// trunk's height by 30 percent of the tree
let trunkHeight: number = Math.floor(treeHeight * 0.3);
// trunk's width by 8 percent of the tree
let trunkWidth: number = Math.floor(treeWidth * 0.08);

ฟังก์ชัน drawTrunk รับพารามิเตอร์เป็นความสูงต้นคริสมาสต์จากฟังก์ชันก่อนหน้า จากนั้นเรากำหนดค่าความสูงของต้นเป็น 30 เปอร์เซนต์ของความสูงของใบ และความกว้างของลำต้นเป็น 8 เปอร์เซนต์ของความสูงของใบ นั่นหมายความว่าขนาดของลำต้นจะปรับขนาดตามความสูงของต้นไม้อัตโนมัติ

for (let i = 0; i < trunkHeight; i++) {
    let row: string = "";
    for (let j = 0; j < treeWidth; j++) {
        if (j >= halfCol - trunkWidth && j <= halfCol + trunkWidth) {
            row += "T";
        } else {
            row += " ";
        }
    }
    console.log(row);
}

และสุดท้ายเราใช้คำสั่ง for loop เพื่อวาดลำต้นอีกครั้งโดยสร้างตารางที่มีขนาด trunkHeight * treeWidth โดยเงื่อนไขในการวาดลำต้นจะเริ่มจากตรงกลาง halfCol และขยายพื้นที่ไปทางซ้ายและทางขวา 8 เปอร์เซนต์ของความสูงของใบไม้ที่ได้กำหนดในตัวแปร trunkWidth

console.log("Christopher's Christmas Tree");
drawTree(10);

console.log("\nEmily's Christmas Tree");
drawTree(8);

console.log("\nRebecca's Christmas Tree");
drawTree(6);

ในที่สุดการวาดต้นคริสมาสต์ก็สำเร็จ และเรานำฟังก์ชันนี้ไปวาดต้นคริสมาสต์ให้กับเพื่อนๆ โดยพวกเขาสามารถเลือกความสูงของต้นคริสมาสต์ที่ต้องการได้ ในตัวอย่าง ต้นคริสมาสต์ของคริสโตเฟอร์มีความสูงเป็น 10 ของเอมิลี่มีความสูงเป็น 8 และของเบคก้ามีความสูงเป็น 6 และตอนนี้คุณสามารถลองวาดต้นคริสมาสต์ของคุณเองได้

จะเห็นว่าฟังก์ชันช่วยให้โปรแกรมทำงานเป็นระบบมากขึ้น เนื่องจากโค้ดถูกนำไปสร้างเป็นฟังก์ชันตามหน้าที่การทำงานของมัน นี่มีประโยชน์มากในการนำกลับมาใช้ใหม่และดูแลรักษา เช่น หากมีข้อผิดพลาดบางอย่างในฟังก์ชัน เราสามารถแก้ไขในที่เดียวและส่วนที่เรียกใช้ฟังก์ชันทั้งหมดจะได้รับการแก้ไขตามไปด้วย เป็นต้น

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับฟังก์ชันในภาษา TypeScript เราได้พูดถึงการประกาศและใช้งานฟังก์ชัน การสร้างประเภทข้อมูลสำหรับฟังก์ชันด้วยคำสั่ง type ที่ใช้สำหรับกำหนดโครงสร้างให้กับฟังก์ชัน และสุดท้ายเป็นการวาดต้นคริสมาสต์เพื่อต้อนรับเทศกาลคริสมาสต์ที่กำลังจะมาถึง

บทความนี้เป็นประโยชน์หรือไม่? Yes · No