From 3c01f30087372cf3093f561db52264f7ef7095e6 Mon Sep 17 00:00:00 2001 From: Boris Verkhovskiy Date: Sat, 6 Jul 2024 05:12:47 -0600 Subject: [*/th-th] fix filenames --- th-th/pascal-th.html.markdown | 235 +++++++++++++++++++++++++++++++++++ th-th/pascal.th.html.markdown | 235 ----------------------------------- th-th/typescript-th.html.markdown | 255 ++++++++++++++++++++++++++++++++++++++ th-th/typescript.th.html.markdown | 255 -------------------------------------- 4 files changed, 490 insertions(+), 490 deletions(-) create mode 100644 th-th/pascal-th.html.markdown delete mode 100644 th-th/pascal.th.html.markdown create mode 100644 th-th/typescript-th.html.markdown delete mode 100644 th-th/typescript.th.html.markdown diff --git a/th-th/pascal-th.html.markdown b/th-th/pascal-th.html.markdown new file mode 100644 index 00000000..5c2284b6 --- /dev/null +++ b/th-th/pascal-th.html.markdown @@ -0,0 +1,235 @@ +--- +language: Pascal +filename: learnpascal-th.pas +contributors: + - ["Ganesha Danu", "http://github.com/blinfoldking"] + - ["Keith Miyake", "https://github.com/kaymmm"] +translators: + - ["Worajedt Sitthidumrong", "https://bitbucket.org/wrj"] +lang: th-th +--- + +> Pascal (ปาสกาล) เป็นภาษาโปรแกรมมิ่งทั้งแบบ imperative และ procedural ที่ออกแบบโดย Niklaus Wirth (นิเคล้า เวิร์ท) เมื่อปี 1968-69 และเผยแพร่ตอน 1970 โดยเน้นให้เป็นภาษาที่เล็ก มีประสิทธิภาพ เพื่อเสริมการเขียนโปรแกรมที่มีแนวปฏิบัติที่ดีด้วยการใช้โครงสร้างของตัวภาษา และโครงสร้างข้อมูลมากำกับ ชื่อของภาษานี้ตั้งเป็นเกียรติให้กับนักคณิตศาสตร์ชาวฝรั่งเศส, นักปรัชญา และนักฟิสิกส์ ชื่อ Blaise Pascal (เบลส ปาสกาล) ข้อมูลจาก : [วิกิพีเดีย][1] + +การคอมไพล์และรันโค้ดภาษาปาสกาลนี้ สามารถใช้ปาสกาลคอมไพลเลอร์ฟรีชื่อ Free Pascal ได้ โดย [ดาวน์โหลดที่นี่][2] + +ด้านล่างจะเป็นโครงสร้างภาษาหลัก ๆ ที่ต้องเข้าใจก่อน ปาสกาลจะเป็นภาษาที่เข้มงวดกับโครงสร้างโค้ดมาก + +```pascal +//โปรแกรมปาสกาล +//คอมเม้นต์เขียนแบบนี้ ใช้สแลชสองครั้ง +{ + แต่ถ้าต้องการคอมเม้นหลาย ๆ บรรทัด + ให้ใช้ วงเล็บปีกกา (curly brackets) + เนื้อหาอยู่บรรทัดเดียวกันกับปีกกาได้ +} + +//อย่างแรก ต้องประกาศ ชื่อโปรแกรม +program learn_pascal; //<-- ห้ามลืม semicolon + +const + { + ประกาศค่าคงที่ (constant) ในบล็อคนี้ + } +type + { + ประกาศชนิดข้อมูลของเราเองที่นี่ ไม่ว่าจะเป็น ชนิดข้อมูลทั่วไป + หรือจะเป็นคลาส + } +var + { + ตัวแปร ในภาษาปาสกาล ไม่เหมือนกับภาษาอื่น ๆ + เพราะต้องประกาศในบล็อค var ก่อนใช้งานเสมอ + } + +//มาถึงส่วนโปรแกรมหลัก หรือ main fucntion นั่นเอง +begin + { + โค้ดเราทำงานอะไร อย่างไร ก็เริ่มรันจากตรงนี้ + } +end. // จบการทำงานของ _โปรแกรม_ เราจะจบด้วย จุลภาค "." +``` + +โค้ดต่อจากนี้ จะเป็นการอธิบายประกาศตัวแปรของปาสกาล + +```pascal +//การประกาศตัวแปร ทำได้แบบนี้ +//var ชื่อตัวแปร : ชนิด ; +var a:integer; +var b:integer; + +//หรือแบบที่นิยมมากกว่า คือเอามาเก็บในบล็อค var ทั้งหมด +var + a : integer; + b : integer; + +//ถ้าจะเอาแบบสั้น ๆ บรรทัดเดียว ก็ทำได้ ทำได้พร้อมกันหลาย ๆ ตัวแปรด้วย +var a,b : integer; +``` + +โค้ดตัวอย่างนี้เป็นโปรแกรม Learn\_More ที่เป็นโครงสร้างโปรแกรมง่าย ๆ ที่จบสมบูรณ์หนึ่งโปรแกรม มีบล็อค program, const, type, main (Begin..End.) + +```pascal +program Learn_More; +// มาต่อเรื่อง ชนิดของข้อมูล (data types) และ ตัวดำเนินการ (operators) + +const + PI = 3.141592654; + GNU = 'GNU''s Not Unix'; + // ค่าคงที่ ให้ตั้งชื่อเป็น ตัวพิมพ์ใหญ่ ทั้งหมด ใช้กับชนิดข้อมูลใดๆ ก็ได้ + // ค่าคงที่ ก็ตามชื่อเลย กำหนดค่าแล้ว ไม่สามารถเปลี่ยนแปลงได้ขณะรัน + +// การประกาศชนิดข้อมูลของเราเอง +// "ชนิด" ของตัวแปรสองแบบนี้ จะนำไปใช้ด้านล่าง +type + ch_array : array [0..255] of char; + // อะเรย์ เป็นชนิดข้อมูลที่มี ความยาว/ช่องเก็บข้อมูล และ ชนิดข้อมูล + // โค้ดด้านบน เป็นการประกาศอะเรย์ของตัวอักษา 255 ตัวอักษา + // ซึ่งได้ ความยาว/ช่องเก็บข้อมูลในตัวแปรตัวนี้ 256 ช่องที่เป็นข้อความ + md_array : array of array of integer; + // ด้านบนนี้ เป็นตัวอย่าง อะเรย์สองมิติของเลขจำนวนเต็ม + // อะเรย์ ยังซ้อนกับอะเรย์ได้อีกด้วย ทำให้สร้าง อะเรย์หลายมิติได้ + // เรายังสามารถสร้าง อะเรย์ที่มีความยาวช่องเท่ากับศูนย์ (0) ได้อีกด้วย + // ซึ่งทำให้เกิด อะเรย์ที่จำนวนช่องยืดหยุ่นได้ (dymaically sized array) + +// การประกาศตัวแปร : ชื่อตัวแปรเหล่านี้จะนำไปใช้ด้านล่างต่อไป +var + int, c, d : integer; + // ประกาศในบล็อค var มีตัวแปรสามตัวเป็นอินทีเจอร์ + // ชนิดจำนวนเต็ม แบบ 16 bit มีช่วงข้อมูล [-32,768.. 32,767] + // »int« ในที่นี้เป็น "ชื่อตัวแปร" ที่ต้นฉบับตั้งให้สอดคล้องกับชนิดข้อมูล + // อย่าสับสนกับบางภาษาที่มีชนิด int ประกาศหน้าชื่อตัวแปร + r : real; + // ตัวแปร r เป็นชนิดเรียล (real) หรือเลขทศนิยม + // real มีช่วงข้อมูล [3.4E-38..3.4E38] + bool : boolean; + // ข้อมูลชนิดบูเลียน (boolean) มีค่าได้สองแบบ คือ True/False + ch : char; + // ตัวแปร ch เป็นชนิดตัวอักษร (ชาร์? คาร์?) หรือคาแรกเตอร์ + // ตัวอักษรเป็นแบบ ASCII 8 bit ดังนั้นจะไม่ใช่ UTF, Unicode + str : string; + // ตัวแปรสตริงจะเก็บข้อความ หรือ char หลาย ๆ ตัว + // ชนิดข้อมูลนี้ไม่เป็นมาตรฐานภาษาแต่คอมไพเลอร์ปาสกาลก็มักจะมีให้ + // ทั่ว ๆ ไปแล้ว จะเป็นอะเรย์ของ char ความยาวตั้งต้น 255 + s : string[50]; + // แบบนี้คือ กำหนดความยาว string เอง ให้เก็บ char 50 ตัว + // แบบนี้ก็ทำให้ประหยัดหน่วยความจำมากขึ้นนั่นเอง + my_str: ch_array; + // ชนิดตัวแปร ใช้เป็นชนิดที่เรากำหนดเองก็ได้ อย่างตอนนี้ + // ch_array เป็น "ชนิดข้อมูล" ที่เราสร้างขึ้นมาในบล็อค type + my_2d : md_array; + // ตัวแปรแบบอะเรย์ที่ไม่ประกาศขนาด (dynamically sized array) + // ก่อนเอาไปใช้จริงต้องระบุขนาดก่อนใช้เสมอ + + // ชนิดข้อมูลแบบ integer เพิ่มเติม + b : byte; // มีช่วงข้อมูล [0..255] + shi : shortint; // มีช่วงข้อมูล [-128..127] + smi : smallint; // มีช่วงข้อมูล [-32,768..32,767] (standard Integer) + w : word; // มีช่วงข้อมูล [0..65,535] + li : longint; // มีช่วงข้อมูล [-2,147,483,648..2,147,483,647] + lw : longword; // มีช่วงข้อมูล [0..4,294,967,295] + c : cardinal; // ก็คือ longword + i64 : int64; // มีช่วงข้อมูล + // [-9223372036854775808..9223372036854775807] + qw : qword; // มีช่วงข้อมูล [0..18,446,744,073,709,551,615] + + // ชนิดข้อมูลแบบ real เพิ่มเติม + rr : real; // มีช่วงข้อมูลที่ขึ้นกับระบบปฏิบัติการ + // (เช่นเป็นแบบ 8-bit, 16-bit, ฯลฯ) + rs : single; // มีช่วงข้อมูล [1.5E-45..3.4E38] + rd : double; // มีช่วงข้อมูล [5.0E-324 .. 1.7E308] + re : extended; // มีช่วงข้อมูล [1.9E-4932..1.1E4932] + rc : comp; // มีช่วงข้อมูล [-2E64+1 .. 2E63-1] + +Begin + // การกำหนดค่าตัวแปรให้ขณะประกาศ + int := 1; + r := 3.14; + ch := 'a'; // ใช้ single quote เหมือนกันทั้ง char และ string + str := 'apple'; + bool := true; + // ภาษาปาสกาล มอง "ชื่อเฉพาะ" แบบไม่สนพิมพ์ใหญ่พิมพ์เล็ก + // (case-insensitive language) + // ตัวดำเนินการแบบคณิตศาสตร์ (arithmethic operation) + int := 1 + 1; // int = 2 ซึ่งจะกำหนดทับค่าเดิมด้านบนที่เคยประกาศ + int := int + 1; // int = 2 + 1 = 3 นำค่าตอนนี้ (2) มา +1 ได้ 3 + int := 4 div 2; // int = 2 หารด้วย div จะได้ผลเป็น integer เสมอ + int := 3 div 2; // int = 1 + int := 1 div 2; // int = 0 + + bool := true or false; // bool = true + bool := false and true; // bool = false + bool := true xor true; // bool = false + + r := 3 / 2; // หารด้วย / จะได้ผลเป็น real เสมอ + r := int; // เรากำหนดค่า integer ให้ตัวแปร real ได้ + // แต่ทำกลับกัน โดยกำหนด real ให้ integer ไม่ได้ + + c := str[1]; // กำหนดค่าแรกใน array str ให้ตัวแปร c ที่เป็น char + str := 'hello' + 'world'; // เรารวม string เข้าด้วยกันด้วย + + + my_str[0] := 'a'; // กำหนดค่าให้ string เฉพาะตำแหน่งแบบอะเรย์ทั่วไป + + setlength(my_2d,10,10); // ปรับขนาดอะเรย์ 2 มิติให้เป็นขนาด 10x10 + // โดยตัวแปร my_2d นี้สร้างแล้วด้านบน + for c := 0 to 9 do // อะเรย์เริ่มจาก 0 และจบที่ ความยาว-1 + for d := 0 to 9 do // ตัวนับ (counter) จำเป็นต้องประกาศก่อนใช้ + my_2d[c,d] := c * d; + // กำหนดอะเรย์หลายมิติ ด้วยการใช้วงเล็บก้ามปู (square brackets) + +End. +// จบโปรแกรมบริบูรณ์ ด้วย "." +``` + +ด้านล่าง เป็นตัวอย่างการเขียนโปรแกรมปาสกาลชื่อ Functional\_Programming + +```pascal +program Functional_Programming; + +Var + i, dummy : integer; + +function factorial_recursion(const a: integer) : integer; +{ ทำการคำนวณแฟคทอเรียลซ้ำ ๆ ของเลขจำนวนเต็ม โดยผ่านพารามิเตอร์ a + ถ้าจะประกาศตัวแปรโลคอลในฟังก์ชั่น ก็ทำได้ โดยการใช้บล็อค var ภายในฟังก์ชั่น + เช่น : + var + local_a : integer; +} +Begin + If a >= 1 Then + { ฟังก์ชั่นนี้คืนค่ากลับ โดยการกำหนดค่าที่ผ่านทางพารามิเตอร์ a + นำมาคูณกับฟังก์ชั่นที่ผ่าน a-1 สุดท้ายก็กำหนดค่าลงไปให้กับฟังก์ชั่นตรงๆ } + factorial_recursion := a * factorial_recursion(a-1) + Else + factorial_recursion := 1; +End; // จบ ฟังก์ชั่น ด้วย ";" หลัง End ไม่เหมือนกับจบ โปรแกรม ที่จะใช้ "." + +procedure get_integer(var i : integer; dummy : integer); +{ เรารับ input จากผู้ใช้มาเก็บใน parameter i ที่เป็น integer ที่ตั้งขึ้นใน + พารามิเตอร์ โดยใช้ var ประกาศ ทำให้ค่าที่รับเข้ามาจะเปลี่ยนปรับได้จาก + ภายนอกการประกาศพารามิเตอร์นี้ ส่วน dummy เป็นตัวแปรที่ปรับเปลี่ยนได้ + "เฉพาะจากภายในฟังก์ชั่น,โพรซีเยอร์นั้น ๆ } +Begin + write('Enter an integer: '); + readln(i); + dummy := 4; // dummy จะไม่ทำให้ค่าที่ได้รับมาครั้งแรกใน main block เปลี่ยน +End; + +//--------------------// +// main program block +//--------------------// +Begin + dummy := 3; + get_integer(i, dummy); + writeln(i, '! = ', factorial_recursion(i)); + // พิมพ์ค่า i! + writeln('dummy = ', dummy); // จะให้ค่าเป็น '3' เสมอ + // เพราะจะไม่เปลี่ยนเนื่องด้วย + // การประกาศพารามิเตอร์ใน + // โพรซีเยอร์ get_integer ด้านบน +End. +``` + +[1]: https://en.wikipedia.org/wiki/Pascal_(programming_language) +[2]: https://www.freepascal.org/ diff --git a/th-th/pascal.th.html.markdown b/th-th/pascal.th.html.markdown deleted file mode 100644 index e4e06102..00000000 --- a/th-th/pascal.th.html.markdown +++ /dev/null @@ -1,235 +0,0 @@ ---- -language: Pascal -filename: learnpascal.pas -contributors: - - ["Ganesha Danu", "http://github.com/blinfoldking"] - - ["Keith Miyake", "https://github.com/kaymmm"] -translators: - - ["Worajedt Sitthidumrong", "https://bitbucket.org/wrj"] -lang: th-th ---- - -> Pascal (ปาสกาล) เป็นภาษาโปรแกรมมิ่งทั้งแบบ imperative และ procedural ที่ออกแบบโดย Niklaus Wirth (นิเคล้า เวิร์ท) เมื่อปี 1968-69 และเผยแพร่ตอน 1970 โดยเน้นให้เป็นภาษาที่เล็ก มีประสิทธิภาพ เพื่อเสริมการเขียนโปรแกรมที่มีแนวปฏิบัติที่ดีด้วยการใช้โครงสร้างของตัวภาษา และโครงสร้างข้อมูลมากำกับ ชื่อของภาษานี้ตั้งเป็นเกียรติให้กับนักคณิตศาสตร์ชาวฝรั่งเศส, นักปรัชญา และนักฟิสิกส์ ชื่อ Blaise Pascal (เบลส ปาสกาล) ข้อมูลจาก : [วิกิพีเดีย][1] - -การคอมไพล์และรันโค้ดภาษาปาสกาลนี้ สามารถใช้ปาสกาลคอมไพลเลอร์ฟรีชื่อ Free Pascal ได้ โดย [ดาวน์โหลดที่นี่][2] - -ด้านล่างจะเป็นโครงสร้างภาษาหลัก ๆ ที่ต้องเข้าใจก่อน ปาสกาลจะเป็นภาษาที่เข้มงวดกับโครงสร้างโค้ดมาก - -```pascal -//โปรแกรมปาสกาล -//คอมเม้นต์เขียนแบบนี้ ใช้สแลชสองครั้ง -{ - แต่ถ้าต้องการคอมเม้นหลาย ๆ บรรทัด - ให้ใช้ วงเล็บปีกกา (curly brackets) - เนื้อหาอยู่บรรทัดเดียวกันกับปีกกาได้ -} - -//อย่างแรก ต้องประกาศ ชื่อโปรแกรม -program learn_pascal; //<-- ห้ามลืม semicolon - -const - { - ประกาศค่าคงที่ (constant) ในบล็อคนี้ - } -type - { - ประกาศชนิดข้อมูลของเราเองที่นี่ ไม่ว่าจะเป็น ชนิดข้อมูลทั่วไป - หรือจะเป็นคลาส - } -var - { - ตัวแปร ในภาษาปาสกาล ไม่เหมือนกับภาษาอื่น ๆ - เพราะต้องประกาศในบล็อค var ก่อนใช้งานเสมอ - } - -//มาถึงส่วนโปรแกรมหลัก หรือ main fucntion นั่นเอง -begin - { - โค้ดเราทำงานอะไร อย่างไร ก็เริ่มรันจากตรงนี้ - } -end. // จบการทำงานของ _โปรแกรม_ เราจะจบด้วย จุลภาค "." -``` - -โค้ดต่อจากนี้ จะเป็นการอธิบายประกาศตัวแปรของปาสกาล - -```pascal -//การประกาศตัวแปร ทำได้แบบนี้ -//var ชื่อตัวแปร : ชนิด ; -var a:integer; -var b:integer; - -//หรือแบบที่นิยมมากกว่า คือเอามาเก็บในบล็อค var ทั้งหมด -var - a : integer; - b : integer; - -//ถ้าจะเอาแบบสั้น ๆ บรรทัดเดียว ก็ทำได้ ทำได้พร้อมกันหลาย ๆ ตัวแปรด้วย -var a,b : integer; -``` - -โค้ดตัวอย่างนี้เป็นโปรแกรม Learn\_More ที่เป็นโครงสร้างโปรแกรมง่าย ๆ ที่จบสมบูรณ์หนึ่งโปรแกรม มีบล็อค program, const, type, main (Begin..End.) - -```pascal -program Learn_More; -// มาต่อเรื่อง ชนิดของข้อมูล (data types) และ ตัวดำเนินการ (operators) - -const - PI = 3.141592654; - GNU = 'GNU''s Not Unix'; - // ค่าคงที่ ให้ตั้งชื่อเป็น ตัวพิมพ์ใหญ่ ทั้งหมด ใช้กับชนิดข้อมูลใดๆ ก็ได้ - // ค่าคงที่ ก็ตามชื่อเลย กำหนดค่าแล้ว ไม่สามารถเปลี่ยนแปลงได้ขณะรัน - -// การประกาศชนิดข้อมูลของเราเอง -// "ชนิด" ของตัวแปรสองแบบนี้ จะนำไปใช้ด้านล่าง -type - ch_array : array [0..255] of char; - // อะเรย์ เป็นชนิดข้อมูลที่มี ความยาว/ช่องเก็บข้อมูล และ ชนิดข้อมูล - // โค้ดด้านบน เป็นการประกาศอะเรย์ของตัวอักษา 255 ตัวอักษา - // ซึ่งได้ ความยาว/ช่องเก็บข้อมูลในตัวแปรตัวนี้ 256 ช่องที่เป็นข้อความ - md_array : array of array of integer; - // ด้านบนนี้ เป็นตัวอย่าง อะเรย์สองมิติของเลขจำนวนเต็ม - // อะเรย์ ยังซ้อนกับอะเรย์ได้อีกด้วย ทำให้สร้าง อะเรย์หลายมิติได้ - // เรายังสามารถสร้าง อะเรย์ที่มีความยาวช่องเท่ากับศูนย์ (0) ได้อีกด้วย - // ซึ่งทำให้เกิด อะเรย์ที่จำนวนช่องยืดหยุ่นได้ (dymaically sized array) - -// การประกาศตัวแปร : ชื่อตัวแปรเหล่านี้จะนำไปใช้ด้านล่างต่อไป -var - int, c, d : integer; - // ประกาศในบล็อค var มีตัวแปรสามตัวเป็นอินทีเจอร์ - // ชนิดจำนวนเต็ม แบบ 16 bit มีช่วงข้อมูล [-32,768.. 32,767] - // »int« ในที่นี้เป็น "ชื่อตัวแปร" ที่ต้นฉบับตั้งให้สอดคล้องกับชนิดข้อมูล - // อย่าสับสนกับบางภาษาที่มีชนิด int ประกาศหน้าชื่อตัวแปร - r : real; - // ตัวแปร r เป็นชนิดเรียล (real) หรือเลขทศนิยม - // real มีช่วงข้อมูล [3.4E-38..3.4E38] - bool : boolean; - // ข้อมูลชนิดบูเลียน (boolean) มีค่าได้สองแบบ คือ True/False - ch : char; - // ตัวแปร ch เป็นชนิดตัวอักษร (ชาร์? คาร์?) หรือคาแรกเตอร์ - // ตัวอักษรเป็นแบบ ASCII 8 bit ดังนั้นจะไม่ใช่ UTF, Unicode - str : string; - // ตัวแปรสตริงจะเก็บข้อความ หรือ char หลาย ๆ ตัว - // ชนิดข้อมูลนี้ไม่เป็นมาตรฐานภาษาแต่คอมไพเลอร์ปาสกาลก็มักจะมีให้ - // ทั่ว ๆ ไปแล้ว จะเป็นอะเรย์ของ char ความยาวตั้งต้น 255 - s : string[50]; - // แบบนี้คือ กำหนดความยาว string เอง ให้เก็บ char 50 ตัว - // แบบนี้ก็ทำให้ประหยัดหน่วยความจำมากขึ้นนั่นเอง - my_str: ch_array; - // ชนิดตัวแปร ใช้เป็นชนิดที่เรากำหนดเองก็ได้ อย่างตอนนี้ - // ch_array เป็น "ชนิดข้อมูล" ที่เราสร้างขึ้นมาในบล็อค type - my_2d : md_array; - // ตัวแปรแบบอะเรย์ที่ไม่ประกาศขนาด (dynamically sized array) - // ก่อนเอาไปใช้จริงต้องระบุขนาดก่อนใช้เสมอ - - // ชนิดข้อมูลแบบ integer เพิ่มเติม - b : byte; // มีช่วงข้อมูล [0..255] - shi : shortint; // มีช่วงข้อมูล [-128..127] - smi : smallint; // มีช่วงข้อมูล [-32,768..32,767] (standard Integer) - w : word; // มีช่วงข้อมูล [0..65,535] - li : longint; // มีช่วงข้อมูล [-2,147,483,648..2,147,483,647] - lw : longword; // มีช่วงข้อมูล [0..4,294,967,295] - c : cardinal; // ก็คือ longword - i64 : int64; // มีช่วงข้อมูล - // [-9223372036854775808..9223372036854775807] - qw : qword; // มีช่วงข้อมูล [0..18,446,744,073,709,551,615] - - // ชนิดข้อมูลแบบ real เพิ่มเติม - rr : real; // มีช่วงข้อมูลที่ขึ้นกับระบบปฏิบัติการ - // (เช่นเป็นแบบ 8-bit, 16-bit, ฯลฯ) - rs : single; // มีช่วงข้อมูล [1.5E-45..3.4E38] - rd : double; // มีช่วงข้อมูล [5.0E-324 .. 1.7E308] - re : extended; // มีช่วงข้อมูล [1.9E-4932..1.1E4932] - rc : comp; // มีช่วงข้อมูล [-2E64+1 .. 2E63-1] - -Begin - // การกำหนดค่าตัวแปรให้ขณะประกาศ - int := 1; - r := 3.14; - ch := 'a'; // ใช้ single quote เหมือนกันทั้ง char และ string - str := 'apple'; - bool := true; - // ภาษาปาสกาล มอง "ชื่อเฉพาะ" แบบไม่สนพิมพ์ใหญ่พิมพ์เล็ก - // (case-insensitive language) - // ตัวดำเนินการแบบคณิตศาสตร์ (arithmethic operation) - int := 1 + 1; // int = 2 ซึ่งจะกำหนดทับค่าเดิมด้านบนที่เคยประกาศ - int := int + 1; // int = 2 + 1 = 3 นำค่าตอนนี้ (2) มา +1 ได้ 3 - int := 4 div 2; // int = 2 หารด้วย div จะได้ผลเป็น integer เสมอ - int := 3 div 2; // int = 1 - int := 1 div 2; // int = 0 - - bool := true or false; // bool = true - bool := false and true; // bool = false - bool := true xor true; // bool = false - - r := 3 / 2; // หารด้วย / จะได้ผลเป็น real เสมอ - r := int; // เรากำหนดค่า integer ให้ตัวแปร real ได้ - // แต่ทำกลับกัน โดยกำหนด real ให้ integer ไม่ได้ - - c := str[1]; // กำหนดค่าแรกใน array str ให้ตัวแปร c ที่เป็น char - str := 'hello' + 'world'; // เรารวม string เข้าด้วยกันด้วย + - - my_str[0] := 'a'; // กำหนดค่าให้ string เฉพาะตำแหน่งแบบอะเรย์ทั่วไป - - setlength(my_2d,10,10); // ปรับขนาดอะเรย์ 2 มิติให้เป็นขนาด 10x10 - // โดยตัวแปร my_2d นี้สร้างแล้วด้านบน - for c := 0 to 9 do // อะเรย์เริ่มจาก 0 และจบที่ ความยาว-1 - for d := 0 to 9 do // ตัวนับ (counter) จำเป็นต้องประกาศก่อนใช้ - my_2d[c,d] := c * d; - // กำหนดอะเรย์หลายมิติ ด้วยการใช้วงเล็บก้ามปู (square brackets) - -End. -// จบโปรแกรมบริบูรณ์ ด้วย "." -``` - -ด้านล่าง เป็นตัวอย่างการเขียนโปรแกรมปาสกาลชื่อ Functional\_Programming - -```pascal -program Functional_Programming; - -Var - i, dummy : integer; - -function factorial_recursion(const a: integer) : integer; -{ ทำการคำนวณแฟคทอเรียลซ้ำ ๆ ของเลขจำนวนเต็ม โดยผ่านพารามิเตอร์ a - ถ้าจะประกาศตัวแปรโลคอลในฟังก์ชั่น ก็ทำได้ โดยการใช้บล็อค var ภายในฟังก์ชั่น - เช่น : - var - local_a : integer; -} -Begin - If a >= 1 Then - { ฟังก์ชั่นนี้คืนค่ากลับ โดยการกำหนดค่าที่ผ่านทางพารามิเตอร์ a - นำมาคูณกับฟังก์ชั่นที่ผ่าน a-1 สุดท้ายก็กำหนดค่าลงไปให้กับฟังก์ชั่นตรงๆ } - factorial_recursion := a * factorial_recursion(a-1) - Else - factorial_recursion := 1; -End; // จบ ฟังก์ชั่น ด้วย ";" หลัง End ไม่เหมือนกับจบ โปรแกรม ที่จะใช้ "." - -procedure get_integer(var i : integer; dummy : integer); -{ เรารับ input จากผู้ใช้มาเก็บใน parameter i ที่เป็น integer ที่ตั้งขึ้นใน - พารามิเตอร์ โดยใช้ var ประกาศ ทำให้ค่าที่รับเข้ามาจะเปลี่ยนปรับได้จาก - ภายนอกการประกาศพารามิเตอร์นี้ ส่วน dummy เป็นตัวแปรที่ปรับเปลี่ยนได้ - "เฉพาะจากภายในฟังก์ชั่น,โพรซีเยอร์นั้น ๆ } -Begin - write('Enter an integer: '); - readln(i); - dummy := 4; // dummy จะไม่ทำให้ค่าที่ได้รับมาครั้งแรกใน main block เปลี่ยน -End; - -//--------------------// -// main program block -//--------------------// -Begin - dummy := 3; - get_integer(i, dummy); - writeln(i, '! = ', factorial_recursion(i)); - // พิมพ์ค่า i! - writeln('dummy = ', dummy); // จะให้ค่าเป็น '3' เสมอ - // เพราะจะไม่เปลี่ยนเนื่องด้วย - // การประกาศพารามิเตอร์ใน - // โพรซีเยอร์ get_integer ด้านบน -End. -``` - -[1]: https://en.wikipedia.org/wiki/Pascal_(programming_language) -[2]: https://www.freepascal.org/ diff --git a/th-th/typescript-th.html.markdown b/th-th/typescript-th.html.markdown new file mode 100644 index 00000000..955f01c0 --- /dev/null +++ b/th-th/typescript-th.html.markdown @@ -0,0 +1,255 @@ +--- +language: TypeScript +contributors: + - ["Philippe Vlérick", "https://github.com/pvlerick"] + - ["Worajedt Sitthidumrong", "https://bitbucket.org/wrj"] +filename: learntypescript-th.ts +lang: th-th +--- + +TypeScript เป็นภาษาที่มีเป้าหมายเพื่อทำให้การพัฒนาซอฟต์แวร์ขนาดใหญ่ด้วย JavaScript ทำได้ง่ายขึ้น โดยที่ TypeScript ได้เพิ่มแนวคิดที่พบทั่วไป อาทิ classes, modules, interfaces, generics และ static typing (ไม่บังคับ) เข้าไปในภาษา JavaScript ดังนั้น TypeScript ก็เลยเป็น Super Set ของ JavaScript อีกที โค้ด JavaScript ทุกส่วน ก็คือโค้ดที่ทำงานได้ถูกต้องใน TypeScript ทำให้เราเพิ่ม TypeScript เข้าไปใช้ในโปรเจคการพัฒนาของเราได้ไม่ยากเลย เพราะ TypeScript คอมไพล์ผลลัพธ์ออกมาเป็น JavaScript ในท้ายสุดอยู่ดี + +บทความนี้จะเน้นเฉพาะ syntax ส่วนขยายของ TypeScript ซึ่งจะไม่รวมกับที่มีใน [JavaScript](/docs/javascript) + +การทดสอบเขียน TypeScript เริ่มได้ง่าย ๆ โดยเข้าไปที่ +[Playground](https://www.typescriptlang.org/Playground) ซึ่งคุณจะเขียนโค้ดพร้อม autocomplete และเห็นเลยว่ามันจะแปลงมาเป็นผลลัพธ์แบบ JavaScript อย่างไร + +```ts +// TypeScript มี data type พื้นฐาน 3 แบบ +let isDone: boolean = false; +let lines: number = 42; +let name: string = "Anders"; + +// แต่เราก็สามารถละการบอกชนิดได้ โดยชนิดตัวแปรก็จะปรับชนิดของเขาจากข้อมูลที่กำหนดให้โดยตรง +let isDone = false; +let lines = 42; +let name = "Anders"; + +// ถ้าไม่รู้ ก็กำหนดเป็นชนิด "Any" ได้ +let notSure: any = 4; +notSure = "maybe a string instead"; +notSure = false; // โอเค ตอนนี้เป็น Boolean แน่ ๆ + +// ใช้ const สำหรับสร้าง ค่าคงที่ +const numLivesForCat = 9; +numLivesForCat = 1; // Error + +// สำหรับ collections มี typed arrays และ generic arrays +// ก็คือ อะเรย์บอกชนิด และ อะเรย์เจเนอริก ตามลำดับ +let list: number[] = [1, 2, 3]; +// ในอีกทางหนึ่ง สร้างเป็นอะเรย์ชนิด generic array +let list: Array = [1, 2, 3]; + +// และสำหรับ enumerations: +enum Color { Red, Green, Blue }; +let c: Color = Color.Green; + +// สุดท้าย, "void" ใช้เมื่อเป็นกรณีพิเศษที่ฟังก์ชันไม่ส่งค่ากลับ +function bigHorribleAlert(): void { + alert("I'm a little annoying box!"); +} + +// ฟังก์ชั่น (Functions) เป็นสิ่งที่มีความสำคัญมาเป็นอันดับหนึ่ง รองรับการใช้ "fat arrow" ในการสร้าง lambda function และ type inference + +// สไตล์ต่อไปนี้มีค่าเท่ากันกับบรรทัดที่ยกตัวอย่างด้านล่าง เพราะคอมไพเลอร์จะมองเหมือนกัน และได้ JavaScript แบบเดียวกัน +let f1 = function (i: number): number { return i * i; } +// อนุมานชนิดที่ส่งกลับ หรือ type inferred +let f2 = function (i: number) { return i * i; } +// เขียนแบบ "Fat arrow" แต่บอกชนิดส่งกลับ +let f3 = (i: number): number => { return i * i; } +// เขียนแบบ "Fat arrow" แต่อนุมานชนิดส่งกลับ +let f4 = (i: number) => { return i * i; } +// เขียนแบบ "Fat arrow" อนุมานชนิดส่งกลับ พร้อมกับไม่มีวงเล็บ แปลว่าไม่ต้องมี return keyword ด้วย +let f5 = (i: number) => i * i; + +// Interfaces นั้นเป็นเหมือนเราออกแบบโครงสร้าง คุณสมบัติต่าง ๆ ตอนเอาไปใช้ จะต้องเป็นไปตาม interface นั้น ๆ เหมือนกับเป็นการกำหนดสเป็คของ "ชนิดข้อมูล" +interface Person { + name: string; + // Optional properties กำหนดด้วย "?" + age?: number; + // และมี function พร้อมชนิดได้ใน interface + move(): void; +} + +// Object นี้ implements "Person" interface ทำให้มันเป็นชนิด Person และมันก็มี property name และ function move() +let p: Person = { name: "Bobby", move: () => { } }; +// Objects นี้เป็นชนิด Person ด้วย และมี optional property หรือ age?: นั่นเอง +let validPerson: Person = { name: "Bobby", age: 42, move: () => { } }; +// ไม่ใช่ Person เพราะ age: ต้องเป็น number เท่านั้น ตามข้อกำหนดใน interface Person +let invalidPerson: Person = { name: "Bobby", age: true }; + +// Interfaces ยังนำมาใช้ในลักษณะของ function ได้อีกด้วย +interface SearchFunc { + (source: string, subString: string): boolean; +} +// เฉพาะชนิด parameters เท่านั้นที่สำคัญ ชื่อของมันไม่จำเป็นต้องเหมือน +let mySearch: SearchFunc; +mySearch = function (src: string, sub: string) { + return src.search(sub) != -1; +} + +// สมาชิกใน class จะเข้าถึงได้แบบ public เป็นค่าปริยาย +class Point { + // Properties + // ตั้งค่า Properties ของ class นี้ + x: number; + + // Constructor + // เราใส่ public/private keywords ตรงนี้ได้ มีผลเหมือนกันกับกำหนด x ด้านบน + // ในตัวอย่าง y มีการกำหนดเช่นเดียวกับ x แต่พิมพ์สั้นกว่า + // สังเกตว่า มีการกำหนดค่าปริยายให้ parameters ได้ด้วย + + constructor(x: number, public y: number = 0) { + this.x = x; + } + + // Functions + dist() { return Math.sqrt(this.x*this.x + this.y*this.y); } + + // Static members + static origin = new Point(0, 0); +} + +// Classes สามารถระบุชนิด interface ที่ต้องการได้ตรง ๆ ด้วยเช่นโค้ดด้านล่าง +// แต่อะไรที่จะ implement มานั้น ถ้าไม่ได้กำหนดไว้ใน constructor ก็จะเกิดข้อผิดพลาดตอนคอมไพล์ +class PointPerson implements Person { + name: string // ตรงนี้จะผิด แก้ไขโดยการไปสร้างตัวรับค่าเข้ามาผ่านทาง constructor + move() {} +} + +let p1 = new Point(10, 20); +let p2 = new Point(25); //y เป็น 0 เพราะกำหนดค่าปริยายไว้ให้แล้ว + +// Inheritance การสืบทอดคุณสมบัติ +class Point3D extends Point { + constructor(x: number, y: number, public z: number = 0) { + super(x, y); // เราจะต้องเรียกใช้ super class constructor โดยตรง + } + + // Overwrite ฟังก์ชั่นที่มีอยู่เดิมใน Point + dist() { + let d = super.dist(); + return Math.sqrt(d * d + this.z * this.z); + } +} + +// Modules ใช้เป็นกลุ่มของ class เราใช้ "." เป็นตัวแบ่ง sub modules +// อย่างกรณีนี้จะเป็น Module.Class เช่น Geometry.Square +module Geometry { + export class Square { + constructor(public sideLength: number = 0) { + } + area() { + return Math.pow(this.sideLength, 2); + } + } +} + +let s1 = new Geometry.Square(5); + +// เราทำให้เรียกใช้ง่ายขึ้นโดยการใช้ alias มาอ้างชื่อ module แบบเดียวกับบางภาษา เช่น Python +import G = Geometry; + +let s2 = new G.Square(10); + +// Generics +// Classes +class Tuple { + constructor(public item1: T1, public item2: T2) { + } +} + +// Interfaces +interface Pair { + item1: T; + item2: T; +} + +// และ functions +let pairToTuple = function (p: Pair) { + return new Tuple(p.item1, p.item2); +}; + +let tuple = pairToTuple({ item1: "hello", item2: "world" }); + +// เราเรียกใช้ไฟล์ definition แบบนี้: +/// + +// Template Strings ( คือ strings ที่ใช้ backticks ครอบ — "`" ปุ่มบนซ้ายคีย์บอร์ด ) +// แทรกข้อความใน String ด้วย Template Strings +let name = 'Tyrone'; +let greeting = `Hi ${name}, how are you?` +// Strings หลายบรรทัดก็ทำได้ใน Template Strings +let multiline = `This is an example +of a multiline string`; + +// READONLY: ความสามารถใหม่ใน TypeScript 3.1 +interface Person { + readonly name: string; + readonly age: number; +} + +var p1: Person = { name: "Tyrone", age: 42 }; +p1.age = 25; // Error แน่นอน เพราะ p1.age ถูกกำหนดเป็น read-only + +var p2 = { name: "John", age: 60 }; // สังเกตว่า p2 ไม่ได้กำหนดเป็น Person +var p3: Person = p2; // ทำได้ เป็น read-only alias ของ p2 และกำหนดเป็น Person +p3.x = 35; // Error p3.x ก็เป็น read-only +p2.x = 45; // Ok ทำได้แต่ก็จะเปลี่ยนค่า p3.x ด้วย เพราะ p3 เป็น alias ของ p2 + +class Car { + readonly make: string; + readonly model: string; + readonly year = 2018; + + constructor() { + this.make = "Unknown Make"; // อนุญาตให้กำหนดค่าได้ใน constructor แม้ว่าจะ read-only + this.model = "Unknown Model"; // อนุญาตให้กำหนดค่าได้ใน constructor แม้ว่าจะ read-only + } +} + +let numbers: Array = [0, 1, 2, 3, 4]; +let moreNumbers: ReadonlyArray = numbers; +moreNumbers[5] = 5; // Error, สมาชิกอะเรย์เป็น read-only แปลว่า ห้ามแก้ไข +moreNumbers.push(5); // Error, push method ใช้ไม่ได้ เพราะมันจะไปแก้ไข read-only array +moreNumbers.length = 3; // Error, เพราะ length ก็ต้อง read-only +numbers = moreNumbers; // Error, method ที่ทำให้อะเรย์เปลี่ยนได้จะไม่อนุญาต + +// Tagged Union Types สำหรับโมเดลสเตท ที่อาจจะมีได้หลายๆ สเตท +type State = + | { type: "loading" } + | { type: "success", value: number } + | { type: "error", message: string }; + +ประกาศ const state: State; +if (state.type === "success") { + console.log(state.value); +} else if (state.type === "error") { + console.error(state.message); +} + +// Iterators และ Generators + +// ประโยคแบบ for..of +// การทำซ้ำกับ ลิสต์ของค่าในออปเจ็คต์ +let arrayOfAnyType = [1, "string", false]; +for (const val of arrayOfAnyType) { + console.log(val); // 1, "string", false +} + +let list = [4, 5, 6]; +for (const i of list) { + console.log(i); // 4, 5, 6 +} + +// ประโยคแบบ for..in +// การทำซ้ำกับ ลิสต์ของคีย์ในออปเจ็คต์ +for (const i in list) { + console.log(i); // 0, 1, 2 +} +``` + +## อ่านเพิ่มเติมที่ + +* [TypeScript Official website](https://www.typescriptlang.org/) +* [Source Code on GitHub](https://github.com/microsoft/TypeScript) diff --git a/th-th/typescript.th.html.markdown b/th-th/typescript.th.html.markdown deleted file mode 100644 index 955f01c0..00000000 --- a/th-th/typescript.th.html.markdown +++ /dev/null @@ -1,255 +0,0 @@ ---- -language: TypeScript -contributors: - - ["Philippe Vlérick", "https://github.com/pvlerick"] - - ["Worajedt Sitthidumrong", "https://bitbucket.org/wrj"] -filename: learntypescript-th.ts -lang: th-th ---- - -TypeScript เป็นภาษาที่มีเป้าหมายเพื่อทำให้การพัฒนาซอฟต์แวร์ขนาดใหญ่ด้วย JavaScript ทำได้ง่ายขึ้น โดยที่ TypeScript ได้เพิ่มแนวคิดที่พบทั่วไป อาทิ classes, modules, interfaces, generics และ static typing (ไม่บังคับ) เข้าไปในภาษา JavaScript ดังนั้น TypeScript ก็เลยเป็น Super Set ของ JavaScript อีกที โค้ด JavaScript ทุกส่วน ก็คือโค้ดที่ทำงานได้ถูกต้องใน TypeScript ทำให้เราเพิ่ม TypeScript เข้าไปใช้ในโปรเจคการพัฒนาของเราได้ไม่ยากเลย เพราะ TypeScript คอมไพล์ผลลัพธ์ออกมาเป็น JavaScript ในท้ายสุดอยู่ดี - -บทความนี้จะเน้นเฉพาะ syntax ส่วนขยายของ TypeScript ซึ่งจะไม่รวมกับที่มีใน [JavaScript](/docs/javascript) - -การทดสอบเขียน TypeScript เริ่มได้ง่าย ๆ โดยเข้าไปที่ -[Playground](https://www.typescriptlang.org/Playground) ซึ่งคุณจะเขียนโค้ดพร้อม autocomplete และเห็นเลยว่ามันจะแปลงมาเป็นผลลัพธ์แบบ JavaScript อย่างไร - -```ts -// TypeScript มี data type พื้นฐาน 3 แบบ -let isDone: boolean = false; -let lines: number = 42; -let name: string = "Anders"; - -// แต่เราก็สามารถละการบอกชนิดได้ โดยชนิดตัวแปรก็จะปรับชนิดของเขาจากข้อมูลที่กำหนดให้โดยตรง -let isDone = false; -let lines = 42; -let name = "Anders"; - -// ถ้าไม่รู้ ก็กำหนดเป็นชนิด "Any" ได้ -let notSure: any = 4; -notSure = "maybe a string instead"; -notSure = false; // โอเค ตอนนี้เป็น Boolean แน่ ๆ - -// ใช้ const สำหรับสร้าง ค่าคงที่ -const numLivesForCat = 9; -numLivesForCat = 1; // Error - -// สำหรับ collections มี typed arrays และ generic arrays -// ก็คือ อะเรย์บอกชนิด และ อะเรย์เจเนอริก ตามลำดับ -let list: number[] = [1, 2, 3]; -// ในอีกทางหนึ่ง สร้างเป็นอะเรย์ชนิด generic array -let list: Array = [1, 2, 3]; - -// และสำหรับ enumerations: -enum Color { Red, Green, Blue }; -let c: Color = Color.Green; - -// สุดท้าย, "void" ใช้เมื่อเป็นกรณีพิเศษที่ฟังก์ชันไม่ส่งค่ากลับ -function bigHorribleAlert(): void { - alert("I'm a little annoying box!"); -} - -// ฟังก์ชั่น (Functions) เป็นสิ่งที่มีความสำคัญมาเป็นอันดับหนึ่ง รองรับการใช้ "fat arrow" ในการสร้าง lambda function และ type inference - -// สไตล์ต่อไปนี้มีค่าเท่ากันกับบรรทัดที่ยกตัวอย่างด้านล่าง เพราะคอมไพเลอร์จะมองเหมือนกัน และได้ JavaScript แบบเดียวกัน -let f1 = function (i: number): number { return i * i; } -// อนุมานชนิดที่ส่งกลับ หรือ type inferred -let f2 = function (i: number) { return i * i; } -// เขียนแบบ "Fat arrow" แต่บอกชนิดส่งกลับ -let f3 = (i: number): number => { return i * i; } -// เขียนแบบ "Fat arrow" แต่อนุมานชนิดส่งกลับ -let f4 = (i: number) => { return i * i; } -// เขียนแบบ "Fat arrow" อนุมานชนิดส่งกลับ พร้อมกับไม่มีวงเล็บ แปลว่าไม่ต้องมี return keyword ด้วย -let f5 = (i: number) => i * i; - -// Interfaces นั้นเป็นเหมือนเราออกแบบโครงสร้าง คุณสมบัติต่าง ๆ ตอนเอาไปใช้ จะต้องเป็นไปตาม interface นั้น ๆ เหมือนกับเป็นการกำหนดสเป็คของ "ชนิดข้อมูล" -interface Person { - name: string; - // Optional properties กำหนดด้วย "?" - age?: number; - // และมี function พร้อมชนิดได้ใน interface - move(): void; -} - -// Object นี้ implements "Person" interface ทำให้มันเป็นชนิด Person และมันก็มี property name และ function move() -let p: Person = { name: "Bobby", move: () => { } }; -// Objects นี้เป็นชนิด Person ด้วย และมี optional property หรือ age?: นั่นเอง -let validPerson: Person = { name: "Bobby", age: 42, move: () => { } }; -// ไม่ใช่ Person เพราะ age: ต้องเป็น number เท่านั้น ตามข้อกำหนดใน interface Person -let invalidPerson: Person = { name: "Bobby", age: true }; - -// Interfaces ยังนำมาใช้ในลักษณะของ function ได้อีกด้วย -interface SearchFunc { - (source: string, subString: string): boolean; -} -// เฉพาะชนิด parameters เท่านั้นที่สำคัญ ชื่อของมันไม่จำเป็นต้องเหมือน -let mySearch: SearchFunc; -mySearch = function (src: string, sub: string) { - return src.search(sub) != -1; -} - -// สมาชิกใน class จะเข้าถึงได้แบบ public เป็นค่าปริยาย -class Point { - // Properties - // ตั้งค่า Properties ของ class นี้ - x: number; - - // Constructor - // เราใส่ public/private keywords ตรงนี้ได้ มีผลเหมือนกันกับกำหนด x ด้านบน - // ในตัวอย่าง y มีการกำหนดเช่นเดียวกับ x แต่พิมพ์สั้นกว่า - // สังเกตว่า มีการกำหนดค่าปริยายให้ parameters ได้ด้วย - - constructor(x: number, public y: number = 0) { - this.x = x; - } - - // Functions - dist() { return Math.sqrt(this.x*this.x + this.y*this.y); } - - // Static members - static origin = new Point(0, 0); -} - -// Classes สามารถระบุชนิด interface ที่ต้องการได้ตรง ๆ ด้วยเช่นโค้ดด้านล่าง -// แต่อะไรที่จะ implement มานั้น ถ้าไม่ได้กำหนดไว้ใน constructor ก็จะเกิดข้อผิดพลาดตอนคอมไพล์ -class PointPerson implements Person { - name: string // ตรงนี้จะผิด แก้ไขโดยการไปสร้างตัวรับค่าเข้ามาผ่านทาง constructor - move() {} -} - -let p1 = new Point(10, 20); -let p2 = new Point(25); //y เป็น 0 เพราะกำหนดค่าปริยายไว้ให้แล้ว - -// Inheritance การสืบทอดคุณสมบัติ -class Point3D extends Point { - constructor(x: number, y: number, public z: number = 0) { - super(x, y); // เราจะต้องเรียกใช้ super class constructor โดยตรง - } - - // Overwrite ฟังก์ชั่นที่มีอยู่เดิมใน Point - dist() { - let d = super.dist(); - return Math.sqrt(d * d + this.z * this.z); - } -} - -// Modules ใช้เป็นกลุ่มของ class เราใช้ "." เป็นตัวแบ่ง sub modules -// อย่างกรณีนี้จะเป็น Module.Class เช่น Geometry.Square -module Geometry { - export class Square { - constructor(public sideLength: number = 0) { - } - area() { - return Math.pow(this.sideLength, 2); - } - } -} - -let s1 = new Geometry.Square(5); - -// เราทำให้เรียกใช้ง่ายขึ้นโดยการใช้ alias มาอ้างชื่อ module แบบเดียวกับบางภาษา เช่น Python -import G = Geometry; - -let s2 = new G.Square(10); - -// Generics -// Classes -class Tuple { - constructor(public item1: T1, public item2: T2) { - } -} - -// Interfaces -interface Pair { - item1: T; - item2: T; -} - -// และ functions -let pairToTuple = function (p: Pair) { - return new Tuple(p.item1, p.item2); -}; - -let tuple = pairToTuple({ item1: "hello", item2: "world" }); - -// เราเรียกใช้ไฟล์ definition แบบนี้: -/// - -// Template Strings ( คือ strings ที่ใช้ backticks ครอบ — "`" ปุ่มบนซ้ายคีย์บอร์ด ) -// แทรกข้อความใน String ด้วย Template Strings -let name = 'Tyrone'; -let greeting = `Hi ${name}, how are you?` -// Strings หลายบรรทัดก็ทำได้ใน Template Strings -let multiline = `This is an example -of a multiline string`; - -// READONLY: ความสามารถใหม่ใน TypeScript 3.1 -interface Person { - readonly name: string; - readonly age: number; -} - -var p1: Person = { name: "Tyrone", age: 42 }; -p1.age = 25; // Error แน่นอน เพราะ p1.age ถูกกำหนดเป็น read-only - -var p2 = { name: "John", age: 60 }; // สังเกตว่า p2 ไม่ได้กำหนดเป็น Person -var p3: Person = p2; // ทำได้ เป็น read-only alias ของ p2 และกำหนดเป็น Person -p3.x = 35; // Error p3.x ก็เป็น read-only -p2.x = 45; // Ok ทำได้แต่ก็จะเปลี่ยนค่า p3.x ด้วย เพราะ p3 เป็น alias ของ p2 - -class Car { - readonly make: string; - readonly model: string; - readonly year = 2018; - - constructor() { - this.make = "Unknown Make"; // อนุญาตให้กำหนดค่าได้ใน constructor แม้ว่าจะ read-only - this.model = "Unknown Model"; // อนุญาตให้กำหนดค่าได้ใน constructor แม้ว่าจะ read-only - } -} - -let numbers: Array = [0, 1, 2, 3, 4]; -let moreNumbers: ReadonlyArray = numbers; -moreNumbers[5] = 5; // Error, สมาชิกอะเรย์เป็น read-only แปลว่า ห้ามแก้ไข -moreNumbers.push(5); // Error, push method ใช้ไม่ได้ เพราะมันจะไปแก้ไข read-only array -moreNumbers.length = 3; // Error, เพราะ length ก็ต้อง read-only -numbers = moreNumbers; // Error, method ที่ทำให้อะเรย์เปลี่ยนได้จะไม่อนุญาต - -// Tagged Union Types สำหรับโมเดลสเตท ที่อาจจะมีได้หลายๆ สเตท -type State = - | { type: "loading" } - | { type: "success", value: number } - | { type: "error", message: string }; - -ประกาศ const state: State; -if (state.type === "success") { - console.log(state.value); -} else if (state.type === "error") { - console.error(state.message); -} - -// Iterators และ Generators - -// ประโยคแบบ for..of -// การทำซ้ำกับ ลิสต์ของค่าในออปเจ็คต์ -let arrayOfAnyType = [1, "string", false]; -for (const val of arrayOfAnyType) { - console.log(val); // 1, "string", false -} - -let list = [4, 5, 6]; -for (const i of list) { - console.log(i); // 4, 5, 6 -} - -// ประโยคแบบ for..in -// การทำซ้ำกับ ลิสต์ของคีย์ในออปเจ็คต์ -for (const i in list) { - console.log(i); // 0, 1, 2 -} -``` - -## อ่านเพิ่มเติมที่ - -* [TypeScript Official website](https://www.typescriptlang.org/) -* [Source Code on GitHub](https://github.com/microsoft/TypeScript) -- cgit v1.2.3