Skip to content

TypeScript

TypeScript เป็นภาษาที่มีความยืดหยุ่นและสามารถใช้ได้กับโครงการขนาดใหญ่หรือเล็ก โดยมีเครื่องมือและไลบรารีต่างๆ ที่รองรับการพัฒนา

ประโยชน์ของ TypeScript

คุณสมบัติหลักรายละเอียด
การตรวจสอบชนิดข้อมูลตรวจสอบชนิดข้อมูลขณะคอมไพล์ ช่วยลดข้อผิดพลาดขณะรันโปรแกรม
การเขียนโปรแกรมเชิงวัตถุรองรับ class, interface, inheritance สำหรับการออกแบบระบบ
เครื่องมือพัฒนาขั้นสูงมี autocomplete, refactoring และ IntelliSense ที่แม่นยำ
ทำงานร่วมกับ JavaScriptสามารถใช้โค้ด JavaScript ที่มีอยู่ได้ทันที
จัดการโครงการขนาดใหญ่โครงสร้างโค้ดที่ชัดเจน ช่วยให้ทีมทำงานร่วมกันได้ดี
ระบบนิเวศที่แข็งแกร่งมีไลบรารีและเฟรมเวิร์กมากมายที่รองรับ TypeScript
ฟีเจอร์ ECMAScript ล่าสุดสามารถใช้ฟีเจอร์ใหม่ๆ ของ JavaScript ก่อนที่เบราว์เซอร์จะรองรับ
เอกสารอัตโนมัติระบบ Type ช่วยสร้างและดูแลเอกสารอัตโนมัติ

TypeScript ช่วยเพิ่มประสิทธิภาพการทำงานของทีมพัฒนาด้วยการทำให้โค้ดอ่านเข้าใจง่ายขึ้นและลดข้อผิดพลาดที่พบได้บ่อยในการพัฒนา JavaScript

Installation

Install TypeScript using your preferred package manager:

bash
npm install -D typescript
bash
pnpm add -D typescript
bash
yarn add -D typescript
bash
bun add -D typescript

Installation is the first step to start using TypeScript.

How TypeScript Works

กระบวนการทำงานของ TypeScript:

  1. เขียนโค้ด TypeScript (.ts)
  2. Type Checker ตรวจสอบชนิดข้อมูล
  3. หากถูกต้อง จะคอมไพล์เป็น JavaScript (.js)
  4. หากมีข้อผิดพลาด จะแสดง Error Messages
  5. โค้ด JavaScript ที่ได้ทำงานใน Runtime

Configuration

การสร้างไฟล์ tsconfig.json เป็นขั้นตอนสำคัญในการตั้งค่า TypeScript

bash
tsc --init

หรือสร้างไฟล์ด้วยคอนฟิกพื้นฐาน:

tsconfig.json
json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src"],
  "exclude": ["node_modules"]
}

การกำหนดค่า compilerOptions เป็นหัวใจสำคัญในการตั้งค่า TypeScript

compilerOptions

ตัวเลือกคำอธิบายประโยชน์
www.typescriptlang.org favicontargetเวอร์ชัน JavaScript ที่คอมไพล์ออกมาเข้ากันได้กับรุ่นเบราว์เซอร์หรือ Node.js ที่ต้องการ
www.typescriptlang.org faviconmoduleระบบโมดูลที่ใช้กำหนดรูปแบบการนำเข้า/ส่งออกโมดูล
www.typescriptlang.org faviconstrictเปิดโหมดตรวจสอบชนิดแบบเข้มงวดทั้งหมดลดข้อผิดพลาดและเพิ่มความปลอดภัยของชนิดข้อมูล
www.typescriptlang.org faviconesModuleInteropทำให้การทำงานกับโมดูล ES6 และ CommonJS ง่ายขึ้นเข้ากันได้ดีกับไลบรารีต่างๆ
www.typescriptlang.org faviconskipLibCheckข้ามการตรวจสอบไฟล์ declarationเพิ่มความเร็วในการคอมไพล์
www.typescriptlang.org faviconforceConsistentCasingInFileNamesบังคับใช้การตั้งชื่อไฟล์ให้สอดคล้องกันป้องกันปัญหาเรื่อง case sensitivity
www.typescriptlang.org faviconoutDirโฟลเดอร์ที่เก็บไฟล์ที่คอมไพล์แล้วจัดการไฟล์ที่คอมไพล์แล้วอย่างเป็นระเบียบ
www.typescriptlang.org faviconrootDirโฟลเดอร์หลักของโปรเจคกำหนดโครงสร้างโปรเจคให้ชัดเจน
www.typescriptlang.org faviconbaseUrlใช้สำหรับกำหนด path mappingทำให้การ import สะดวกขึ้น
www.typescriptlang.org faviconpathsกำหนด alias สำหรับ importsลดความซับซ้อนของ path ในการ import
www.typescriptlang.org faviconjsxวิธีการจัดการ JSXสนับสนุนการพัฒนา React/JSX
www.typescriptlang.org favicondeclarationสร้างไฟล์ .d.tsช่วยในการใช้งานไลบรารีกับ TypeScript
www.typescriptlang.org faviconsourceMapสร้าง source map สำหรับ debuggingเดบักโค้ดต้นฉบับได้แม้ทำงานกับไฟล์ที่คอมไพล์แล้ว
www.typescriptlang.org faviconnoImplicitAnyแจ้งเตือนเมื่อมี implicit anyบังคับใช้การระบุชนิดข้อมูลอย่างชัดเจน
www.typescriptlang.org faviconstrictNullChecksตรวจสอบ null/undefined อย่างเข้มงวดลดข้อผิดพลาดจากค่า null/undefined
www.typescriptlang.org faviconallowJsอนุญาตให้คอมไพล์ไฟล์ JavaScriptทำให้สามารถใช้งานไฟล์ JavaScript เดิมได้
www.typescriptlang.org faviconcheckJsตรวจสอบชนิดในไฟล์ JavaScriptได้รับประโยชน์จาก TypeScript ในไฟล์ .js

ดูตัวเลือกทั้งหมดได้ที่ www.typescriptlang.org faviconเอกสารทางการ TypeScript

Type System

ระบบชนิดข้อมูล (Type System) เป็นหัวใจสำคัญของ TypeScript ที่ช่วยเพิ่มความปลอดภัยและความชัดเจนให้กับโค้ด โดยระบบชนิดข้อมูลจะทำหน้าที่:

  • ตรวจสอบความถูกต้องของชนิดข้อมูลขณะคอมไพล์
  • ป้องกันข้อผิดพลาดที่เกิดขึ้นจากการใช้ชนิดข้อมูลผิดประเภท
  • ช่วยในการทำเอกสารโค้ดอัตโนมัติ
  • เพิ่มประสิทธิภาพเครื่องมือพัฒนาเช่น IntelliSense

Basic Types

ชนิดข้อมูลพื้นฐานที่สำคัญใน TypeScript:

ชนิดข้อมูลตัวอย่างคำอธิบาย
stringlet name: string = 'John'ใช้เก็บข้อความ Unicode สามารถใช้ template strings ด้วย `${var}`
numberlet age: number = 30เก็บได้ทั้งจำนวนเต็มและทศนิยม รวมถึง Infinity, NaN
booleanlet isActive: boolean = trueค่าทางตรรกะ true/false เท่านั้น ไม่เหมือน JavaScript ที่รับค่า truthy/falsy
arraylet nums: number[] = [1, 2, 3]อาร์เรย์ของชนิดเดียวกัน ใช้ generic syntax Array<number> ก็ได้
tuplelet user: [string, number]คู่ลำดับที่รู้จักชนิดและจำนวนสมาชิก ใช้กับข้อมูลที่มีโครงสร้างชัดเจน

Special Types

ชนิดข้อมูลพิเศษสำหรับกรณีใช้งานเฉพาะ:

ชนิดข้อมูลตัวอย่างคำอธิบาย
anylet value: any = 'text'ปิดการตรวจสอบชนิด ควรใช้เฉพาะเมื่อจำเป็นจริงๆ เท่านั้น
unknownlet value: unknownปลอดภัยกว่า any ต้องตรวจสอบชนิดก่อนใช้งาน (type guard)
voidfunction log(): voidใช้เมื่อฟังก์ชันไม่คืนค่า ไม่เหมือน undefined ที่อาจคืนค่าได้
neverfunction error(): neverใช้กับฟังก์ชันที่ throw error หรือลูปที่ไม่สิ้นสุด
enumenum Color { Red, Green }กลุ่มค่าคงที่ สามารถเป็น numeric หรือ string ก็ได้

Type Composition

เทคนิคการรวมและจัดการชนิดข้อมูล:

ชนิดข้อมูลตัวอย่างคำอธิบาย
Union`stringnumber`
IntersectionUser & Adminรวม properties จากหลาย type/interface เข้าด้วยกัน

แต่ละชนิดข้อมูลมีบทบาทสำคัญในการสร้างระบบชนิดข้อมูลที่แข็งแกร่งใน TypeScript

Type Creation

การสร้างชนิดข้อมูลใหม่:

ชนิดข้อมูลตัวอย่างคำอธิบาย
interfaceinterface User { name: string }กำหนดโครงสร้างอ็อบเจ็กต์
type aliastype Point = { x: number, y: number }กำหนดชื่อให้ชนิดข้อมูล

Utility Types

ชนิดข้อมูลที่ช่วยให้สามารถจัดการและแปลงชนิดข้อมูลได้อย่างยืดหยุ่น:

ชนิดข้อมูลตัวอย่างคำอธิบาย
Partial<T>Partial<User>ทำให้ทุก property เป็น optional
Readonly<T>Readonly<User>ทำให้ทุก property เป็น readonly
Pick<T,K>Pick<User, 'name'>เลือกบาง properties
Omit<T,K>Omit<User, 'id'>ละเว้นบาง properties

Practical Examples

ฟีเจอร์คำอธิบายตัวอย่างการใช้งาน
Union TypesTypeA | TypeB - รับค่าหลายชนิดใช้งานเมื่อต้องการรับค่าที่เป็นได้หลายประเภท เช่น ID ที่อาจเป็น string หรือ number
Intersection TypesTypeA & TypeB - รวม properties จากหลาย typeสร้าง type ใหม่จาก interface ที่มีอยู่
Type Guardsตรวจสอบชนิดข้อมูลขณะรันใช้งานกับ union types อย่างปลอดภัย
Utility TypesType ที่มีอยู่แล้วสำหรับแปลง type อื่นสร้าง type ที่ดัดแปลงมาจาก type อื่นอย่างรวดเร็ว
Genericsพารามิเตอร์ type ที่นำกลับมาใช้ได้สร้าง component ที่ยืดหยุ่นและปลอดภัยทางชนิดข้อมูล
Decoratorsเพิ่มเติมพฤติกรรมให้ class/methodLogging, Validation, Dependency Injection
Mapped Typesสร้าง type โดยการ map propertiesสร้าง type ใหม่จาก existing type
Conditional Typestype ที่ขึ้นอยู่กับเงื่อนไขกรอง type ตามเงื่อนไขที่กำหนด

ส่วนนี้แสดงตัวอย่างการใช้งาน TypeScript ในสถานการณ์จริง พร้อมคำอธิบายใน comment เพื่อความเข้าใจที่ชัดเจน

Type Manipulation

การจัดการชนิดข้อมูลด้วย Union และ Intersection Types Union Types ใช้เมื่อค่าอาจเป็นได้หลายชนิด Intersection Types ใช้เมื่อต้องการรวม properties จากหลาย interface เข้าด้วยกัน

typescript
// Union Type: Accepts either string or number
let userId: string | number;
userId = 'USER123';  // Valid
userId = 1001;       // Valid

// Intersection Type: Combines properties from multiple interfaces
interface User { name: string; }
interface Admin { roles: string[]; }
type AdminUser = User & Admin;

// ตัวอย่างการใช้งาน AdminUser
let adminUser: AdminUser = {
  name: 'John Doe',
  roles: ['admin', 'moderator']
};

Type Guards

เทคนิคการตรวจสอบชนิดข้อมูลก่อนใช้งาน ช่วยให้ TypeScript สามารถ推断ชนิดข้อมูลได้อย่างถูกต้อง สามารถใช้ typeof, instanceof หรือ user-defined type guards

typescript
// ตรวจสอบชนิดข้อมูลก่อนใช้งาน
function processValue(val: string | number) {
  if (typeof val === 'string') {
    // TypeScript รู้ว่า val เป็น string ในบล็อกนี้
    return val.toUpperCase();
  }
  // TypeScript รู้ว่า val เป็น number ในบล็อกนี้
  return val.toFixed(2);
}

Utility Types

Built-in types ที่ช่วยจัดการและแปลงชนิดข้อมูล ช่วยลดการเขียนโค้ดซ้ำซ้อน มีประโยชน์ในการสร้าง type ที่มีโครงสร้างเฉพาะ

typescript
// ตัวอย่างการใช้ Utility Types
interface Product {
  id: number;
  name: string;
  price: number;
  inStock: boolean;
}

// สร้าง type ที่มีบาง properties เท่านั้น
type ProductPreview = Pick<Product, 'id' | 'name'>;

// สร้าง type ที่ไม่มีบาง properties
type ProductWithoutPrice = Omit<Product, 'price'>;

Generics

การสร้าง component ที่ทำงานกับหลายชนิดข้อมูล เพิ่มความยืดหยุ่นในการใช้งาน ยังคงความปลอดภัยของชนิดข้อมูล

typescript
// ฟังก์ชัน generics ที่ทำงานกับหลายชนิดข้อมูล
function identity<T>(arg: T): T {
  return arg;
}

// เรียกใช้งาน
const output1 = identity<string>('hello');
const output2 = identity<number>(42);

Decorators

typescript
function log(target: any, key: string) {
  console.log(`Method ${key} called`);
}

class Calculator {
  @log
  add(a: number, b: number) {
    return a + b;
  }
}

Mapped Types

typescript
type Optional<T> = {
  [P in keyof T]?: T[P];
};

interface User {
  name: string;
  age: number;
}

type OptionalUser = Optional<User>;

Conditional Types

typescript
type NonNullable<T> = T extends null | undefined ? never : T;

type ValidString = NonNullable<string | null>;  // ผลลัพธ์คือ string

Last updated: