DDevArchive
Đăng nhập

TypeScript cơ bản: thêm "kiểu" cho JavaScript

JavaScript cho phép bạn cộng số với chuỗi mà không báo lỗi — cho tới khi app crash lúc 2 giờ sáng. TypeScript thêm kiểu dữ liệu: biến phải khai báo "tôi là số" hay "tôi là chuỗi", và editor báo lỗi ngay khi bạn viết sai. 90% công ty đã chuyển sang TypeScript.

Vì sao cần TypeScript?

// File: why-ts.js
// JavaScript: không báo lỗi, chạy sai im lặng
function greet(name) {
  return "Xin chào " + name.toUpperCase()
}

greet("An")     // ✅ "Xin chào AN"
greet(42)       // 💥 Runtime error: name.toUpperCase is not a function
greet(undefined) // 💥 Runtime error

// TypeScript: báo lỗi NGAY KHI VIẾT CODE
// function greet(name: string) {
//   return "Xin chào " + name.toUpperCase()
// }
// greet(42)  ← Editor gạch đỏ: "số 42 không phải string"
JavaScriptTypeScript
Lỗi phát hiện khi CHẠY (runtime)Lỗi phát hiện khi VIẾT (compile time)
Biến gì cũng chứa đượcBiến phải khai báo kiểu
Tự do, linh hoạtKỷ luật, an toàn
Dự án nhỏ OKDự án lớn bắt buộc
Không cần buildCần build (tsc) thành JS để chạy

Kiểu dữ liệu cơ bản

// File: types.ts
// Kiểu nguyên thuỷ
let name: string = "An"
let age: number = 25
let isStudent: boolean = true

// Mảng
let scores: number[] = [90, 85, 92]
let names: string[] = ["An", "Bình", "Cường"]

// Object: dùng interface để định nghĩa "hình dạng"
interface User {
  name: string
  age: number
  email: string
  isActive?: boolean  // dấu ? = optional, có thể không có
}

const user: User = {
  name: "An",
  age: 25,
  email: "an@example.com",
  // isActive không bắt buộc nên bỏ qua được
}

// Function: khai báo kiểu tham số và giá trị trả về
function add(a: number, b: number): number {
  return a + b
}

add(1, 2)    // ✅ OK
// add("1", 2) ← 🔴 Error: "1" không phải number

Union types & Type narrowing

// File: union.ts
// Union type: biến có thể là string HOẶC number
let id: string | number
id = "abc"  // ✅
id = 123    // ✅
// id = true ← 🔴 Error: boolean không được

// Type narrowing: kiểm tra kiểu trước khi dùng
function printId(id: string | number) {
  if (typeof id === "string") {
    // TypeScript biết id là string ở đây
    console.log(id.toUpperCase())
  } else {
    // TypeScript biết id là number ở đây
    console.log(id.toFixed(2))
  }
}

// Type alias: đặt tên cho kiểu phức tạp
type Status = 'loading' | 'success' | 'error'

function showMessage(status: Status) {
  if (status === 'loading') console.log('Đang tải...')
  if (status === 'success') console.log('Thành công!')
  if (status === 'error') console.log('Có lỗi!')
}

showMessage('success')  // ✅
// showMessage('pending') ← 🔴 Error: 'pending' không thuộc Status

Cài đặt và chạy TypeScript

// File: setup.sh
# Cài TypeScript
npm install -g typescript

# Kiểm tra phiên bản
tsc --version

# Tạo file TypeScript
echo "const msg: string = \"Xin chào TypeScript\"" > hello.ts

# Biên dịch TS → JS
tsc hello.ts
# → Tạo ra file hello.js

# Chạy file JS
node hello.js

# Hoặc dùng ts-node để chạy trực tiếp (không cần build)
npx ts-node hello.ts
💡 Không cần thành thạo ngay

TypeScript là kỹ năng bạn sẽ dùng mỗi ngày khi đi làm. Bước Foundation chỉ cần hiểu: (1) vì sao cần kiểu, (2) cú pháp cơ bản, (3) interface. Bước Builder sẽ dùng TS trong React và Node.

❓ TypeScript phát hiện lỗi ở giai đoạn nào?

  • Giải thích vì sao TypeScript an toàn hơn JavaScript
  • Khai báo biến với kiểu: string, number, boolean, array
  • Định nghĩa interface cho object
  • Viết function có kiểu tham số và return type
  • Cài đặt và chạy TypeScript bằng tsc hoặc ts-node