พื้นฐานของ TypeScript
บทความนี้อธิบายพื้นฐานของ TypeScript
YouTube Video
การรัน "Hello World!"
ก่อนอื่น เราจะรันตัวอย่าง "Hello World!" แบบคลาสสิกใน TypeScript โดยใช้ Visual Studio Code
npm install -g typescript
ติดตั้ง typescript
โดยใช้คำสั่ง npm
สร้างไฟล์ tsconfig.json
1{
2 "compilerOptions": {
3 "target": "ES6",
4 "module": "CommonJS",
5 "outDir": "out",
6 "sourceMap": true
7 }
8}
สร้างไฟล์ .vscode/launch.json
เพื่อรันไฟล์ main.ts
ใน Visual Studio Code
1{
2 "version": "0.2.0",
3 "configurations": [
4 {
5 "type": "node",
6 "request": "launch",
7 "name": "Launch Program",
8 "skipFiles": [
9 "<node_internals>/**"
10 ],
11 "program": "${workspaceFolder}/main.ts",
12 "preLaunchTask": "tsc: build - tsconfig.json",
13 "outFiles": [
14 "${workspaceFolder}/out/main.js"
15 ]
16 }
17 ]
18}
สร้างไฟล์ main.ts
เพื่อแสดงข้อความ "Hello World!" คุณสามารถรันใน Visual Studio Code โดยกดปุ่ม F5
1console.log("Hello World!");
ด้วยการกำหนดค่าแบบนี้ คุณสามารถรันไฟล์ TypeScript ได้ภายใน VSCode
ภาพรวมของ TypeScript
TypeScript (TS) เป็นภาษาที่ต่อยอดมาจาก JavaScript และพัฒนาโดย Microsoft TypeScript รองรับการกำหนดชนิดข้อมูลแบบ static ซึ่งช่วยให้โค้ดมีความเสถียรและดูแลรักษาง่ายขึ้น
การกำหนดชนิดข้อมูลแบบ Static
- TypeScript เพิ่มการกำหนดชนิดข้อมูลให้กับ JavaScript และทำการตรวจสอบชนิดข้อมูลในระหว่างการคอมไพล์ ช่วยป้องกันข้อผิดพลาดที่เกี่ยวข้องกับชนิดข้อมูลล่วงหน้า
1let message: string = "Hello, TypeScript";
2console.log(message);
การคอมไพล์
- เนื่องจาก TypeScript ไม่สามารถรันโดยตรงในเบราว์เซอร์ได้ จึงต้องถูกแปลงเป็น JavaScript ก่อน ใช้
tsc
(TypeScript Compiler) เพื่อแปลงไฟล์ TS เป็นไฟล์ JS
การกำหนดชนิดข้อมูลแบบตัวเลือก
- TypeScript มีความสามารถในการคาดเดาชนิดข้อมูล และยังอนุญาตให้คุณกำหนดชนิดข้อมูลอย่างชัดเจนเมื่อจำเป็น ช่วยปรับปรุงความเข้าใจและความเสถียรของโค้ด
1function greet(name: string): string {
2 return `Hello, ${name}`;
3}
4console.log(greet('John'));
อินเตอร์เฟซ (Interfaces)
- TypeScript มี
interface
เพื่อกำหนดโครงสร้างของออบเจ็กต์ ช่วยให้ควบคุมโครงสร้างของออบเจ็กต์ได้อย่างเข้มงวด
1interface Person {
2 name: string;
3 age: number;
4}
5const user: Person = { name: "John", age: 30 };
6console.log(user.name);
คลาส (Classes)
- TypeScript ให้ส่วนขยายสำหรับไวยากรณ์ของคลาสใน JavaScript และรองรับการสืบทอด (inheritance), ตัวกำหนดการเข้าถึง (
public
,private
,protected
), และคลาสแบบนามธรรม (abstract classes)
1class Animal {
2 protected name: string;
3 constructor(name: string) {
4 this.name = name;
5 }
6 speak(): void {
7 console.log(`${this.name} makes a sound.`);
8 }
9}
10
11class Dog extends Animal {
12 speak(): void {
13 console.log(`${this.name} barks.`);
14 }
15}
16const animal = new Animal('Generic Animal');
17animal.speak();
18
19const dog = new Dog('Buddy');
20dog.speak();
เจเนอริก (Generics)
- ใน TypeScript คุณสามารถเขียนโค้ดที่นำกลับมาใช้ใหม่ได้และมีความปลอดภัยของประเภทข้อมูล (type-safe) โดยใช้เจเนอริก
1function identity<T>(arg: T): T {
2 return arg;
3}
4console.log(identity<string>("Hello Generics"));
ระบบนิเวศ (Ecosystem)
- TypeScript เข้ากันได้อย่างสมบูรณ์กับระบบนิเวศของ JavaScript และสามารถใช้งานโค้ด JavaScript ที่มีอยู่ได้โดยตรง นอกจากนี้ TypeScript ยังถูกรวมเข้ากับไลบรารีที่ได้รับความนิยม เช่น React และ Node.js
เครื่องมือสำหรับนักพัฒนา (Developer Tools) ที่ทรงพลัง
- TypeScript มีฟีเจอร์ขั้นสูง เช่น การเติมอัตโนมัติ (autocomplete), การสนับสนุนการปรับโครงสร้างโค้ด (refactoring support), และการตรวจสอบข้อผิดพลาดในโปรแกรมแก้ไขอย่าง VSCode
TypeScript มีประโยชน์เป็นพิเศษในการเพิ่มความน่าเชื่อถือและปรับปรุงประสิทธิภาพการทำงานของนักพัฒนาในโครงการขนาดใหญ่
ตัวแปร (Variables) ใน TypeScript
นี่คือการอธิบายแนวคิดพื้นฐานและการใช้งานตัวแปรใน TypeScript
การประกาศตัวแปร (Variable Declaration)
ใน TypeScript ตัวแปรจะถูกประกาศโดยใช้คำสำคัญสามคำ ได้แก่ let
, const
, และ var
แต่ละคำสำคัญมีลักษณะเฉพาะที่แตกต่างกัน
ตัวอย่างของ let
:
let
มีขอบเขตในบล็อก (ใช้ได้เฉพาะภายในวงเล็บปีกกา {}
) ค่าของ let
สามารถเปลี่ยนแปลงได้ในภายหลัง
1let count: number = 10;
2console.log(count); // Outputs: 10
3
4count = 20;
5console.log(count); // Outputs: 20
ตัวอย่างของ const
:
const
ไม่สามารถกำหนดค่าใหม่ได้ ดังนั้นค่าที่กำหนดไปแล้วครั้งหนึ่งจะไม่สามารถเปลี่ยนแปลงได้ อย่างไรก็ตาม เนื้อหาภายในออบเจ็กต์และอาร์เรย์สามารถเปลี่ยนแปลงได้
1const pi: number = 3.14;
2console.log(pi); // Outputs: 3.14
3
4// pi = 3.14159; // Error: Reassignment is not allowed
5
6const fruits: string[] = ["apple", "banana"];
7fruits.push("orange");
8console.log(fruits); // Outputs: ["apple", "banana", "orange"]
ตัวอย่างของ var
:
var
มีขอบเขตฟังก์ชัน (function scope) และสามารถเปลี่ยนค่าที่กำหนดใหม่ได้ อย่างไรก็ตาม การไม่สนใจขอบเขตบล็อก อาจทำให้เกิดพฤติกรรมที่ไม่คาดคิดเมื่อเปรียบเทียบกับ let
หรือ const
1var message: string = "Hello, world!";
2console.log(message); // Outputs: Hello, world!
3
4message = "Hello, TypeScript!";
5console.log(message); // Outputs: Hello, TypeScript!
6
7// (`var` ignores block scope)
8if (true) {
9 var localMessage = "Hello again!";
10}
11console.log(localMessage); // "Hello again!"
การกำกับชนิดข้อมูล (Type Annotations)
ใน TypeScript คุณสามารถระบุประเภทของตัวแปรได้อย่างชัดเจน TypeScript รองรับการเดาประเภท แต่การระบุประเภทช่วยในสถานการณ์ที่ซับซ้อน
1let isDone: boolean = false;
2console.log(isDone); // Outputs: false
3
4let userName: string = "Alice";
5console.log(userName); // Outputs: Alice
ตัวแปรที่ยังไม่ได้กำหนดค่าเริ่มต้น
หากตัวแปรถูกประกาศโดยไม่ได้กำหนดค่าเริ่มต้น จะถูกกำหนดค่าเป็น undefined
โดยค่าเริ่มต้น ตัวแปรที่ประกาศด้วย let
ต้องกำหนดค่าเป็น undefined
อย่างชัดเจนหรือรวม undefined
ไว้ในประเภทของมันหากยังไม่ได้กำหนดค่าเริ่มต้น
1let uninitialized: number | undefined;
2console.log(uninitialized); // Outputs: undefined
3
4uninitialized = 5;
5console.log(uninitialized); // Outputs: 5
ขอบเขตของตัวแปร
let
และ const
มีขอบเขตแบบบล็อก ดังนั้นจะใช้งานได้เฉพาะในบล็อกเดียวกัน
1if (true) {
2 let blockScoped: string = "Block Scoped";
3 console.log(blockScoped); // Outputs: Block Scoped
4}
5// console.log(blockScoped); // Error: blockScoped is out of scope
การโฮสต์ตัวแปร
เนื่องจาก TypeScript เป็นซุปเปอร์เซ็ตของ JavaScript มันจึงสืบทอดคุณสมบัติการโฮสต์ของ JavaScript การโฮสต์หมายถึงลักษณะที่ตัวแปรและการประกาศฟังก์ชันถูกรูปเป็นเหมือนถูกยกขึ้นไปที่ด้านบนของสโคป อย่างไรก็ตาม เฉพาะการประกาศเท่านั้นที่ถูกโฮสต์ ในขณะที่การกำหนดค่าอยู่ในตำแหน่งเดิม ตัวแปรที่ถูกประกาศด้วย var
จะถูกโฮสต์ แต่ถ้าใช้ let
หรือ const
ก่อนการประกาศจะเกิดข้อผิดพลาด
1console.log(a); // undefined
2var a = 10;
3console.log(a); // 10
- ในกรณีนี้ ตัวแปรที่ถูกประกาศด้วย
var
จะถูกโฮสต์ และค่าของมันจะถูกแสดงออก
1console.log(b); // ReferenceError
2let b = 20;
- ตัวแปรที่ประกาศด้วย
let
จะไม่ถูกโฮสต์ และจะทำให้เกิดข้อผิดพลาด
สรุป
ต่อไปนี้คือสรุปของ let
, const
, และ var
let
สามารถกำหนดค่าใหม่ได้และมีขอบเขตในบล็อกconst
ไม่สามารถกำหนดค่าใหม่ได้และมีขอบเขตในบล็อกvar
สามารถกำหนดค่าใหม่ได้และมีขอบเขตในฟังก์ชัน- ทั้งหมดนี้อนุญาตให้ใช้การบันทึกชนิดแบบระบุชัดเจนสำหรับการกำหนดชนิดของตัวแปร
อักขระหลีกใน TypeScript
อักขระหลีกถูกใช้เมื่ออักขระเฉพาะเจาะจงไม่สามารถป้อนลงไปโดยตรงหรือเพื่อแทนอักขระที่มีความหมายพิเศษในตัวอักษร ใน TypeScript, อักขระหลีกถูกใช้เพื่อแทนอักขระควบคุมหรืออักขระพิเศษ
ตัวอย่างเช่น ใช้ \n
เพื่อแสดงข้อความที่มีการย่อหน้าใหม่
1const message: string = "Hello,\nWorld!";
2console.log(message);
3// Output:
4// Hello,
5// World!
การหลีกอักขระพิเศษ
อักขระหลีกยังมีประโยชน์เมื่อคุณต้องการรวมอักขระพิเศษไว้ในตัวอักษร ตัวอย่างเช่น คุณอาจต้องการใช้อัญประกาศคู่หรืออัญประกาศเดี่ยวโดยตรงภายในตัวอักษร
1const singleQuoteExample: string = 'It\'s a beautiful day!';
2console.log(singleQuoteExample);
3// Output: It's a beautiful day!
4
5const doubleQuoteExample: string = "He said, \"Welcome!\"";
6console.log(doubleQuoteExample);
7// Output: He said, "Welcome!"
การหลีกเครื่องหมายแบ็กสแลชเอง
ในการรวมเครื่องหมายแบ็กสแลชในตัวอักษร คุณต้องเขียนเป็นแบ็กสแลชคู่
1const path: string = "C:\\Program Files\\MyApp";
2console.log(path);
3// Output: C:\Program Files\MyApp
การหลีก Unicode และเลขฐานสิบหก
ใน TypeScript, รหัส Unicode สามารถแทนได้ด้วยการใช้อักขระหลีก
ลำดับการหลีกแบบ Unicode
คุณสามารถแทนอักขระ Unicode ได้โดยการระบุเลขฐานสิบหก 4 หลักหลัง \u
1const smileyFace: string = "\u263A";
2console.log(smileyFace);
3// Output: ☺ (Copyright Mark)
การหลีกเลขฐานสิบหก
คุณสามารถแทนอักขระเฉพาะเจาะจงโดยการใช้เลขฐานสิบหก 2 หลักหลัง \x
1const letterA: string = "\x41";
2console.log(letterA);
3// Output: A
Template Literals และอักขระหลีก
Template literals ถูกกำหนดโดยการล้อมด้วยแบ็คทิกส์ และช่วยให้การสร้างข้อความแบบมีตัวแปรฝังอยู่หรือข้อความหลายบรรทัดทำได้ง่ายขึ้น อักขระหลีกทั่วไปสามารถใช้ได้โดยตรงใน template literals
1const multiLine: string = `This is
2a multi-line
3string.`;
4console.log(multiLine);
5// Output:
6// This is
7// a multi-line
8// string.
กรณีพิเศษ
ใน TypeScript, การใช้อักขระหลีกที่ไม่ถูกต้องภายในตัวอักษรอาจส่งผลให้เกิดข้อผิดพลาดทางไวยากรณ์ ดังนั้น การตรวจสอบว่าอักขระหลีกนั้นถูกต้องหรือไม่จึงเป็นสิ่งสำคัญ
1// Invalid escape sequence
2const invalidString: string = "\xZZ"; // Error
ตัวอย่างการใช้งานในทางปฏิบัติ
นี่คือตัวอย่างการสร้างข้อความซับซ้อนโดยใช้อักขระหลีก
1const jsonExample: string = "{\n\t\"name\": \"John Doe\",\n\t\"age\": 30\n}";
2console.log(jsonExample);
3// Output:
4// {
5// "name": "John Doe",
6// "age": 30
7// }
ในตัวอย่างนี้, \n
ถูกใช้สำหรับย่อหน้าใหม่ และ \t
ถูกใช้เพื่อเพิ่มระยะห่าง สิ่งนี้ทำให้โครงสร้าง JSON อ่านได้ง่ายขึ้น
สรุป
อักขระหลบหนีมีความสำคัญมากเมื่อทำงานกับสตริงใน TypeScript เมื่อคุณต้องการใส่อักขระพิเศษหรืออักขระควบคุมในสตริง คุณสามารถสร้างสตริงที่แสดงออกได้โดยใช้อักขระหลบหนีที่เหมาะสม การเข้าใจและใช้อักขระหลบหนีอย่างถูกต้องสามารถปรับปรุงความเข้าใจและการบำรุงรักษาโค้ดได้
เวอร์ชันของ TypeScript
มาดูภาพรวมของเวอร์ชัน TypeScript กัน
-
TypeScript 1.0 (2014)
เวอร์ชันแรกที่เสถียรของ TypeScript ฟีเจอร์พื้นฐานอย่างการระบุประเภท คลาส และโมดูลได้ถูกแนะนำ
-
TypeScript 2.0 (2016)
มีการแนะนำ
Non-nullable Types
,Control Flow Analysis
,Read-only Properties
, และประเภทNever
ซึ่งช่วยเพิ่มประสิทธิภาพการเดาประเภท -
TypeScript 3.0 (2018)
ระบบประเภทที่ยืดหยุ่นมากขึ้นถูกแนะนำ พร้อมฟีเจอร์ต่างๆ เช่น
Project References
, การขยายTuple Types
และการปรับปรุงRest Parameters
-
TypeScript 4.0 (2020)
ฟีเจอร์ต่างๆ เช่น
Variadic Tuple Types
, การปรับปรุงตัวแก้ไข, การเพิ่มประสิทธิภาพการเดาประเภท, และLabelled Tuple Elements
ถูกเพิ่มเข้ามาเพื่อปรับปรุงประสบการณ์การพัฒนา -
TypeScript 4.1 (2020)
มีการแนะนำ
Template Literal Types
ซึ่งทำให้การจัดการประเภทสตริงทรงพลังมากยิ่งขึ้น -
TypeScript 4.3 (2021)
การเพิ่มคีย์เวิร์ด
Override
, การปรับปรุงตัวปรับเปลี่ยนการเข้าถึงในผู้สร้าง, และการสนับสนุนประเภทที่ดียิ่งขึ้นสำหรับWeakMap
และWeakSet
-
TypeScript 4.5 (2021)
ได้เพิ่มประเภท
Awaited
,ModuleSuffixes
, และการปรับปรุงความเข้ากันได้กับโมดูล ECMAScript -
TypeScript 5.0 (2023)
มีการมาตรฐานของ
Decorators
, การปรับปรุงความเร็วในการสร้างโปรเจ็กต์, การเสริมประสิทธิภาพของระบบประเภท, และการสนับสนุนคุณสมบัติ ECMAScript ล่าสุด
TypeScript พัฒนาขึ้นเรื่อย ๆ โดยมีการปล่อยเวอร์ชันใหม่หลายครั้งในแต่ละปี ซึ่งเพิ่มฟีเจอร์ใหม่และการปรับปรุง
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย