TypeScript - Tính năng: Hướng dẫn cho người mới bắt đầu

Xin chào, các nhà lập trình tương lai! Tôi rất vui mừng được làm hướng dẫn viên của bạn trong hành trình đầyExciting vào thế giới của TypeScript. Là một ai đó đã dạy khoa học máy tính trong nhiều năm, tôi đã tận mắt thấy TypeScript có sức mạnh và tính chuyển đổi như thế nào. Hãy cùng nhau lặn sâu và khám phá những tính năng tuyệt vời làm cho TypeScript trở thành người bạn tốt nhất của nhà phát triển!

TypeScript - Features

TypeScript là gì?

Trước khi chúng ta nhảy vào các tính năng, hãy nhanh chóng hiểu qua TypeScript là gì. Hãy tưởng tượng bạn đang xây dựng một ngôi nhà bằng các khối Lego. JavaScript sẽ giống như một hộp lớn đầy các khối có màu khác nhau, nhưng TypeScript lại giống như những khối đó có các hướng dẫn và quy tắc đặc biệt về cách chúng ghép lại với nhau. Nó giúp bạn xây dựng các cấu trúc ổn định và không có lỗi!

Bây giờ, hãy cùng khám phá các tính năng làm cho TypeScript trở nên đặc biệt.

Ghi 类型 (Type Annotation)

Cơ bản về ghi 类型

Ghi 类型 giống như việc dán nhãn vào một hộp để mô tả bên trong có gì. Trong TypeScript, chúng ta sử dụng nó để告诉 máy tính chúng ta đang làm việc với loại dữ liệu nào.

let myName: string = "Alice";
let myAge: number = 30;
let isStudent: boolean = true;

Trong ví dụ này, chúng ta đang告诉 TypeScript rằng:

  • myName chỉ chứa văn bản (chuỗi ký tự)
  • myAge chỉ là số
  • isStudent hoặc là true hoặc là false (boolean)

Điều này giúp ngăn ngừa những sai lầm ngớ ngẩn, như việc cố gắng làm toán với tên của ai đó!

Tại sao nó lại hữu ích

Hãy tưởng tượng bạn đang nấu ăn và vô tình đổ đường vào nước sốt spaghetti thay vì muối. Ghi 类型 giúp ngăn ngừa những sự nhầm lẫn như vậy trong mã của bạn. Nó phát hiện lỗi trước khi chúng xảy ra, tiết kiệm thời gian và giảm bớt đau đầu!

Interfaces

Interfaces giống như bản vẽ cho các đối tượng. Chúng xác định cấu trúc mà một đối tượng nên có.

interface Person {
name: string;
age: number;
greet(): void;
}

let student: Person = {
name: "Bob",
age: 20,
greet: function() {
console.log("Hello, I'm " + this.name);
}
};

Ở đây, chúng ta đã tạo một interface Person nói rằng bất kỳ đối tượng Person nào cũng phải có name, age, và một hàm greet. Đó giống như nói với ai đó, "Nếu bạn muốn trở thành một người trong chương trình này, bạn cần những thứ này!"

Classes

Classes giống như khuôn dẽo cho các đối tượng. Chúng cho phép chúng ta tạo ra nhiều đối tượng với cùng một cấu trúc và hành vi.

class Dog {
name: string;
breed: string;

constructor(name: string, breed: string) {
this.name = name;
this.breed = breed;
}

bark() {
console.log(this.name + " says Woof!");
}
}

let myDog = new Dog("Buddy", "Golden Retriever");
myDog.bark(); // Xuất: Buddy says Woof!

Trong ví dụ này, chúng ta đã tạo một class Dog. Nó giống như một mẫu cho việc tạo ra các đối tượng chó. Mỗi con chó có tên và giống loài, và có thể sủa. Điều này dễ dàng hơn nhiều so việc viết riêng các thuộc tính và phương thức cho từng con chó!

Kế thừa (Inheritance)

Kế thừa giống như việc truyền lại các đặc điểm từ cha mẹ sang con cái. Trong lập trình, nó cho phép một class kế thừa các thuộc tính và phương thức từ một class khác.

class Animal {
name: string;

constructor(name: string) {
this.name = name;
}

move() {
console.log(this.name + " is moving.");
}
}

class Cat extends Animal {
meow() {
console.log(this.name + " says Meow!");
}
}

let myCat = new Cat("Whiskers");
myCat.move(); // Xuất: Whiskers is moving.
myCat.meow(); // Xuất: Whiskers says Meow!

Ở đây, Cat kế thừa từ Animal. Điều này có nghĩa là Cat có tất cả những gì Animal có (như thuộc tính name và phương thức move), cộng với phương thức meow đặc trưng của nó.

Enums

Enums giống như một danh sách các tùy chọn đã xác định. Chúng rất hữu ích khi bạn có một bộ giá trị cố định mà một thứ có thể là.

enum DaysOfWeek {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}

let today: DaysOfWeek = DaysOfWeek.Wednesday;
console.log(today); // Xuất: 2 (vì nó là mục thứ ba trong danh sách, bắt đầu từ 0)

Enums làm cho mã của bạn dễ đọc hơn và giúp ngăn ngừa lỗi bằng cách giới hạn các giá trị có thể của một biến.

Generics

Generics giống như các lá bài comodin trong một trò chơi bài. Chúng cho phép bạn viết các hàm và class linh hoạt, có thể sử dụng với các loại khác nhau trong khi vẫn duy trì tính an toàn của loại.

function identity<T>(arg: T): T {
return arg;
}

let output1 = identity<string>("Hello");
let output2 = identity<number>(42);

console.log(output1); // Xuất: Hello
console.log(output2); // Xuất: 42

Trong ví dụ này, <T> là một biến loại. Nó cho phép hàm identity làm việc với bất kỳ loại nào, trong khi vẫn duy trì tính an toàn của loại.

Union Types

Union types giống như việc có nhiều loại tính cách. Chúng cho phép một biến là một trong nhiều loại.

let mixedType: string | number;
mixedType = "Hello";
console.log(mixedType); // Xuất: Hello

mixedType = 42;
console.log(mixedType); // Xuất: 42

Điều này rất hữu ích khi bạn không chắc chắn về loại dữ liệu bạn sẽ nhận được, nhưng bạn biết rằng nó có thể là một trong một số loại cụ thể.

Type Guards

Type guards giống như các kiểm tra an ninh trong mã của bạn. Chúng giúp bạn thu hẹp loại của một biến trong một khối mã cụ thể.

function printLength(obj: string | string[]) {
if (typeof obj === "string") {
console.log("Length of string: " + obj.length);
} else {
console.log("Length of array: " + obj.length);
}
}

printLength("Hello"); // Xuất: Length of string: 5
printLength(["a", "b", "c"]); // Xuất: Length of array: 3

Type guards giúp TypeScript hiểu loại của một biến trong các ngữ cảnh khác nhau, cho phép bạn sử dụng các thao tác cụ thể của loại một cách an toàn.

Kết luận

Và thế là bạn đã có nó, các bạn! Chúng ta đã cùng nhau hành trình qua những tính năng thú vị của TypeScript. Nhớ rằng, việc học lập trình giống như học một ngôn ngữ mới - nó đòi hỏi sự luyện tập và kiên nhẫn. Đừng sợ thử nghiệm và mắc lỗi; đó là cách chúng ta học tốt nhất!

Tiếp tục lập trình, tiếp tục học hỏi, và trước khi bạn nhận ra, bạn sẽ xây dựng những điều tuyệt vời với TypeScript. Chúc các bạn lập trình vui vẻ!

Credits: Image by storyset