TYPESCRIPT 2.X CĂN BẢN
Hàm trong TypeScript Sử dụng hàm generics Sử dụng hàm generics trong TypeScript Sử dụng Array trong TypeScript Sử dụng Tuple trong TypeScript Sử dụng kiểu Array, Tuple, Enum trong TypeScript Interface trong Typescript Hybrid Types với Interface trong TypeScript Khác biệt khi sử dụng 'type' và 'interface' trong TypeScript Cách dùng Enum trong TypeScript Types và interface trong TypeScript Class trong TypeScript Sử dụng Abstract Classes trong TypeScript Sử dụng Interface trong Typescript (phần 2) Sử dụng Casting trong TypeScript Tìm hiểu về Generics trong TypeScript Tìm hiểu về utility types trong Typescript Utility types phổ biến trong Typescript Sử dụng default parameters trong TypeScript Modules trong TypeScript Rest Parameters trong TypeScript Sử dụng Function Overloadings trong TypeScript Sử dụng Type Assertions trong TypeScript Sử dụng Static Methods và Properties trong TypeScript. Sử dụng Access Modifiers trong TypeScript 10 mẹo và thủ thuật hay nhất trong TypeScript 5 Cách giúp bạn loại bỏ "any" trong TypeScript Mapped Types trong TypeScript Dependency Injection trong Typescript 5 ký hiệu khó hiểu cần biết trong TypeScript Cách sử dụng @ts-expect-error trong Typescript Declaration Merging trong TypeScript Tìm hiểu Branded Type trong TypeScript Namespaces trong Typescript Phân biệt Modules và Namespaces trong TypeScript Triple-Slash Directives trong TypeScript là gì? Phần 1: Biến trong TypeScript Phần 2: Biến trong TypeScript Property trong TypeScript Phân tích JSON trong TypeScript Bài tập TypeScript: Các dạng bài tập cơ bản Bài tập TypeScript: Lập trình Hướng đối tượng trong TypeScript Bài tập TypeScript: Kiểu Generic Types trong Typescript Bài tập TypeScript: Các kiểu dữ liệu mảng và tuple. Bài tập TypeScript: Classes và Inheritance trong Typescript Bài 01: TypeScript là gì? TypeScript và Javascript Bài 02: Cài đặt TypeScript Bài 03: TypeScript Basic Types Bài 04: Khai báo biến trong TypeScript Bài 05: Lệnh If Else và Switch Case trong TypeScript Bài 06: Vòng lặp trong TypeScript
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

10 mẹo và thủ thuật hay nhất trong TypeScript

TypeScript, với khả năng kiểm tra kiểu tại thời điểm biên dịch, giúp bạn viết mã nguồn an toàn và dễ bảo trì hơn. Tuy nhiên, để thực sự tận dụng sức mạnh của TypeScript, bạn cần hiểu rõ các mẹo và thủ thuật mà ngôn ngữ này cung cấp.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong bài viết này, mình sẽ giới thiệu đến bạn 10 mẹo và thủ thuật hay nhất trong TypeScript. Từ tương tác với DOM đến sử dụng Generics, từ kiểm tra kiểu dữ liệu đến chuyển đổi từ JavaScript sang TypeScript, mình sẽ giúp bạn nắm bắt những khía cạnh quan trọng của TypeScript và trở thành một lập trình viên tài năng hơn. Hãy cùng tìm hiểu những bí quyết này và tận hưởng lợi ích mà TypeScript mang lại.

I. TypeScript & DOM

Giải thích cách TypeScript tương tác với DOM

TypeScript là một siêu cấp của JavaScript, và điều này áp dụng cả khi bạn tương tác với DOM (Document Object Model) trong trình duyệt. TypeScript cho phép bạn:

Bài viết này được đăng tại [free tuts .net]

  • Khai báo kiểu dữ liệu cho phần tử DOM: Bằng cách xác định kiểu dữ liệu cho các phần tử DOM, bạn có thể đảm bảo tính chính xác của việc truy cập thuộc tính và phương thức của chúng.

  • Sử dụng IntelliSense: Môi trường phát triển TypeScript, như Visual Studio Code, cung cấp tính năng IntelliSense, giúp bạn tự động hoàn thành mã và hiển thị thông tin kiểu dữ liệu khi bạn gõ mã, giúp tránh lỗi và tối ưu hóa hiệu suất lập trình.

  • Kiểm tra kiểu dữ liệu tại thời điểm biên dịch: TypeScript kiểm tra kiểu dữ liệu của phần tử DOM khi bạn biên dịch mã, giúp bạn phát hiện và sửa lỗi kiểu dữ liệu trước khi chạy ứng dụng.

Hướng dẫn sử dụng TypeScript để thao tác với các phần tử DOM

Dưới đây là một ví dụ về cách sử dụng TypeScript để tương tác với DOM:

// Khai báo kiểu dữ liệu cho phần tử DOM
const myElement: HTMLElement | null = document.getElementById("myElement");

if (myElement) {
    // TypeScript hiểu kiểu dữ liệu của myElement là HTMLElement
    myElement.textContent = "Hello, TypeScript!";
}

Trong ví dụ trên, sử dụng getElementById để tìm phần tử DOM với ID là "myElement" và gán nó cho biến myElement. TypeScript cho phép bạn gán kiểu HTMLElement cho biến này, giúp bạn truy cập các thuộc tính và phương thức của HTMLElement mà không gây lỗi kiểu.

Khi làm việc với DOM trong TypeScript, bạn có thể tận dụng sức mạnh của kiểm tra kiểu dữ liệu và tích hợp tốt hơn với các trình duyệt web.

II. Expect Generics

Generics là một tính năng mạnh mẽ trong TypeScript, cho phép bạn tạo các thành phần mã nguồn (hàm, lớp, giao diện) có thể làm việc với nhiều kiểu dữ liệu khác nhau mà không cần xác định kiểu dữ liệu cụ thể trước thời điểm biên dịch. Điều này giúp tạo ra mã nguồn linh hoạt và tái sử dụng được trong nhiều tình huống khác nhau.

Cách sử dụng Generics để tạo linh hoạt và tái sử dụng mã nguồn

Dưới đây là một ví dụ cụ thể về cách sử dụng Generics trong TypeScript:

Hàm Generic

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

// Sử dụng hàm Generic
let result = identity("Hello, TypeScript"); // result có kiểu string

Trong ví dụ trên, đã tạo một hàm generic identity, với tham số arg kiểu T. Hàm này có thể nhận và trả về bất kỳ kiểu dữ liệu nào. Khi sử dụng hàm identity, TypeScript sẽ tự động xác định kiểu dữ liệu dựa trên tham số truyền vào, giúp tạo mã nguồn linh hoạt.

Lớp Generic

class Box<T> {
    private value: T;

    constructor(initialValue: T) {
        this.value = initialValue;
    }

    getValue(): T {
        return this.value;
    }
}

// Sử dụng lớp Generic
const numberBox = new Box<number>(42);
const stringValue = new Box<string>("TypeScript");

console.log(numberBox.getValue()); // Trả về 42
console.log(stringValue.getValue()); // Trả về "TypeScript"

Trong ví dụ này, mình đã tạo một lớp generic Box, cho phép bạn lưu trữ và truy xuất các giá trị với kiểu dữ liệu chung T. Bằng cách chỉ định kiểu dữ liệu cụ thể khi tạo một đối tượng Box, có thể sử dụng lớp này với nhiều kiểu dữ liệu khác nhau.

Generics cho phép bạn tạo mã nguồn linh hoạt và tái sử dụng, giúp giảm sự lặp lại và tăng tính bảo trì của mã nguồn. Chúng giúp bạn viết mã một lần và sử dụng lại nó cho nhiều loại kiểu dữ liệu khác nhau, làm cho mã nguồn trở nên dễ quản lý hơn.

III. When migrating to TS…

Mẹo khi chuyển đổi từ JavaScript sang TypeScript

Chuyển đổi từ JavaScript sang TypeScript có thể là một quá trình hữu ích để tăng tính bảo mật và quản lý mã nguồn hơn. Dưới đây là một số mẹo quan trọng khi bạn đang thực hiện quá trình chuyển đổi:

  • Bắt đầu từ các phần nhỏ: Bắt đầu từ một số phần nhỏ của dự án để làm quen với TypeScript và dần mở rộng.

  • Sử dụng tùy chọn kiểm tra kiểu (Type Checking): TypeScript cung cấp tùy chọn kiểm tra kiểu dữ liệu tại thời điểm biên dịch. Sử dụng nó để phát hiện và sửa lỗi kiểu dữ liệu.

  • Khai báo kiểu cho biến và hàm: TypeScript yêu cầu bạn khai báo kiểu dữ liệu cho biến và hàm. Sử dụng khai báo kiểu này để giúp TypeScript hiểu mã nguồn của bạn và kiểm tra kiểu dữ liệu.

  • Sử dụng môi trường phát triển hỗ trợ TypeScript: Sử dụng môi trường phát triển như Visual Studio Code để tận dụng tính năng IntelliSense và gợi ý kiểu dữ liệu.

  • Kiểm tra tài liệu và nguồn mở: Tài liệu và ví dụ từ trang web chính thức của TypeScript cũng như cộng đồng TypeScript có sẵn trên GitHub có thể giúp bạn nắm vững TypeScript.

IV. More type restrictions

Trong TypeScript, hạn chế kiểu dữ liệu là các quy tắc mà TypeScript áp dụng để kiểm tra kiểu dữ liệu của biến và giúp đảm bảo tính toàn vẹn của mã nguồn. Các hạn chế kiểu có lợi vì chúng giúp bạn phát hiện lỗi kiểu trước khi chương trình chạy. Dưới đây là một số ví dụ về các hạn chế kiểu dữ liệu trong TypeScript:

  • Hạn chế kiểu dữ liệu: TypeScript không cho phép gán một kiểu dữ liệu cho một kiểu dữ liệu khác mà không thông qua kiểu ép kiểu (type casting).

  • Kiểm tra kiểu tĩnh (Static Type Checking): TypeScript kiểm tra kiểu dữ liệu tại thời điểm biên dịch và thông báo lỗi kiểu trước khi chương trình chạy.

  • Kiểu hữu ích (Literal Types): TypeScript cho phép bạn xác định kiểu dữ liệu dựa trên các giá trị cụ thể, ví dụ như kiểu boolean, number, hoặc string.

  • Kiểm tra kiểu tùy chỉnh (User-Defined Type Guards): TypeScript cho phép bạn tạo các hàm kiểm tra tùy chỉnh để kiểm tra kiểu dữ liệu.

Các hạn chế kiểu dữ liệu trong TypeScript giúp bạn viết mã nguồn an toàn và tối ưu hóa hiệu suất ứng dụng. Chúng đảm bảo rằng bạn không thực hiện các phép toán không hợp lệ và giúp dự án của bạn trở nên dễ bảo trì hơn.

V. "Did we really find it?"

Trong TypeScript, kiểm tra tính tồn tại của một giá trị là một phần quan trọng để đảm bảo tính toàn vẹn của mã nguồn. TypeScript cung cấp các cách để kiểm tra xem một biến có tồn tại hay không, đặc biệt khi làm việc với giá trị undefined hoặc null. Cách thức kiểm tra này giúp tránh lỗi không mong muốn trong mã nguồn.

Sử dụng kiểu "undefined" và "null" để kiểm tra giá trị

Kiểm tra tính tồn tại bằng "undefined":

Trong TypeScript, bạn có thể sử dụng kiểu undefined để kiểm tra xem một biến có giá trị undefined hay không. Dưới đây là một ví dụ:

let value: string | undefined = "Hello, TypeScript!";
if (value !== undefined) {
    console.log("Value is defined:", value);
} else {
    console.log("Value is undefined.");
}

Kiểm tra tính tồn tại bằng "null":

Tương tự, bạn cũng có thể sử dụng kiểu null để kiểm tra giá trị của một biến. Dưới đây là ví dụ:

let value: string | null = "Hello, TypeScript!";
if (value !== null) {
    console.log("Value is not null:", value);
} else {
    console.log("Value is null.");
}

VI. "I’m telling you, TS, it is there!"

Sử dụng TypeScript để xác định kiểu dữ liệu của biến

TypeScript cho phép bạn xác định kiểu dữ liệu của biến một cách rõ ràng. Điều này giúp tránh lỗi kiểu dữ liệu và làm cho mã nguồn trở nên an toàn hơn. Dưới đây là một ví dụ:

let value: any = "Hello, TypeScript!";
let length: number = (value as string).length;
console.log(length); // Kết quả: 16

Trong ví dụ trên, mình đã sử dụng toán tử as để ép kiểu biến value thành kiểu string, sau đó lấy độ dài của chuỗi. TypeScript cho phép thực hiện kiểm tra kiểu dữ liệu và kiểm tra kiểu tại thời điểm biên dịch để đảm bảo tính toàn vẹn của mã nguồn.

VII. Type Guards

Sử dụng Type Guards để kiểm tra và xác định kiểu dữ liệu trong TypeScript

TypeScript cung cấp khái niệm "Type Guards," là các kỹ thuật để kiểm tra và xác định kiểu dữ liệu của biến một cách an toàn. Các loại Type Guards bao gồm:

Kiểm tra kiểu bằng "typeof":

Bạn có thể sử dụng toán tử "typeof" để kiểm tra kiểu dữ liệu của một biến. Ví dụ:

function doSomething(x: string | number) {
    if (typeof x === "string") {
        // x là kiểu string ở đây
    } else {
        // x là kiểu number ở đây
    }
}

​Kiểm tra kiểu bằng "instanceof":

Sử dụng toán tử "instanceof" để kiểm tra xem một đối tượng có thuộc về một lớp cụ thể hay không. Ví dụ:

class Animal {}
class Dog extends Animal {}

function checkAnimal(animal: Animal) {
    if (animal instanceof Dog) {
        // animal là một đối tượng kiểu Dog
    } else {
        // animal không phải là đối tượng kiểu Dog
    }
}

Kiểm tra kiểu tùy chỉnh (User-Defined Type Guards):

Bạn có thể tạo các hàm kiểm tra kiểu tùy chỉnh để xác định kiểu dữ liệu một cách linh hoạt. Ví dụ:

function isString(value: any): value is string {
    return typeof value === "string";
}

function processValue(value: any) {
    if (isString(value)) {
        // value là kiểu string ở đây
    }
}

Các Type Guards giúp TypeScript hiểu kiểu dữ liệu một cách chính xác và cho phép bạn thực hiện kiểm tra kiểu dữ liệu tại thời điểm biên dịch, giúp tránh lỗi kiểu và tối ưu hóa mã nguồn.

VIII. Once more about the generics

Sâu hơn về Generics, bao gồm sử dụng Generics trong hàm và lớp

Generics là một tính năng mạnh mẽ của TypeScript cho phép bạn tạo mã nguồn linh hoạt và tái sử dụng được với nhiều kiểu dữ liệu khác nhau. Ngoài việc sử dụng Generics trong hàm và lớp, bạn cũng có thể sử dụng Generics trong các khía cạnh khác của mã nguồn.

Sử dụng Generics trong hàm:

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

let result = identity<string>("Hello, TypeScript"); // result có kiểu string

Trong ví dụ này, mình sử dụng Generics để tạo hàm identity có thể hoạt động với bất kỳ kiểu dữ liệu nào.

Sử dụng Generics trong lớp:

class Box<T> {
    private value: T;

    constructor(initialValue: T) {
        this.value = initialValue;
    }

    getValue(): T {
        return this.value;
    }
}

const numberBox = new Box<number>(42);
const stringValue = new Box<string>("TypeScript");

Mình đã sử dụng Generics để tạo lớp Box có thể lưu trữ và truy xuất các giá trị với kiểu dữ liệu chung T.

Generics cho phép bạn tận dụng sức mạnh của TypeScript để viết mã nguồn linh hoạt và tái sử dụng, làm cho mã nguồn trở nên dễ quản lý hơn và giúp tối ưu hóa hiệu suất ứng dụng.

IX. Create Interfaces from API response

Hướng dẫn tạo giao diện (interface) từ dữ liệu API response

Khi làm việc với dữ liệu từ API, đảm bảo tính nhất quán giữa dữ liệu và mã nguồn là quan trọng. TypeScript cho phép bạn tạo các giao diện (interfaces) từ dữ liệu API response để đảm bảo rằng dữ liệu bạn nhận được phù hợp với mã nguồn của bạn. Dưới đây là một ví dụ:

// Giao diện (interface) từ dữ liệu API response
interface Post {
    userId: number;
    id: number;
    title: string;
    body: string;
}

// Hàm để lấy dữ liệu từ API
function getPosts(): Promise<Post[]> {
    return fetch("https://jsonplaceholder.typicode.com/posts")
        .then(response => response.json());
}

// Sử dụng dữ liệu API
getPosts().then(posts => {
    posts.forEach(post => {
        // TypeScript hiểu kiểu dữ liệu của 'post' là 'Post'
        console.log(`Post #${post.id}: ${post.title}`);
    });
});

Trong ví dụ trên, mình đã tạo một giao diện Post dựa trên dữ liệu API response. Điều này giúp đảm bảo rằng dữ liệu từ API phù hợp với kiểu dữ liệu mong đợi. TypeScript sẽ kiểm tra tính nhất quán giữa dữ liệu và mã nguồn, giúp tránh lỗi và làm cho mã nguồn dễ bảo trì hơn.

X. Destructuring trong TypeScript

Destructuring là một tính năng mạnh mẽ trong TypeScript cho phép bạn trích xuất các phần tử từ một đối tượng hoặc mảng một cách dễ dàng. Điều này giúp mã nguồn của bạn trở nên ngắn gọn và đảm bảo rằng bạn chỉ sử dụng những phần tử cần thiết.

Sử dụng Destructuring với đối tượng

// Khai báo một đối tượng
const person = { firstName: "John", lastName: "Doe", age: 30 };

// Sử dụng destructuring để trích xuất các thuộc tính
const { firstName, lastName } = person;

console.log(firstName); // Kết quả: "John"
console.log(lastName);  // Kết quả: "Doe"

Trong ví dụ trên, mình đã sử dụng destructuring để trích xuất thuộc tính firstName lastName từ đối tượng person.

Sử dụng Destructuring với mảng

// Khai báo một mảng
const colors = ["red", "green", "blue"];

// Sử dụng destructuring để trích xuất các phần tử
const [firstColor, secondColor] = colors;

console.log(firstColor);  // Kết quả: "red"
console.log(secondColor); // Kết quả: "green"

Trong ví dụ này, mình đã sử dụng destructuring để trích xuất các phần tử từ mảng colors.

Sử dụng destructuring giúp mã nguồn của bạn trở nên sáng sủa và dễ đọc. Nó cũng giúp bạn tránh việc thao tác trực tiếp trên đối tượng hoặc mảng gốc, đảm bảo tính toàn vẹn của dữ liệu.

Kết bài

Trong bài viết này, mình đã tìm hiểu về 10 mẹo và thủ thuật quan trọng nhất trong TypeScript, một siêu cấp của JavaScript, giúp bạn viết mã nguồn an toàn, linh hoạt và dễ bảo trì hơn. Mình đã thảo luận về cách TypeScript tương tác với DOM, sử dụng Generics để tạo mã nguồn tái sử dụng, kiểm tra kiểu dữ liệu, và nhiều khía cạnh quan trọng khác.

Mình cũng đã xem xét các mẹo khi chuyển đổi từ JavaScript sang TypeScript, tận dụng sức mạnh của Generics, kiểm tra kiểu dữ liệu tại thời điểm biên dịch, và tạo giao diện từ dữ liệu API response.

Với kiến thức này, bạn có cơ hội làm cho mã nguồn của mình trở nên mạnh mẽ và dễ quản lý hơn trong các dự án TypeScript của bạn. TypeScript giúp bạn tận dụng sức mạnh của kiểm tra kiểu tại thời điểm biên dịch, giảm lỗi, và tăng hiệu suất phát triển. Chúng tôi hy vọng rằng những mẹo và thủ thuật này sẽ giúp bạn trở thành một lập trình viên TypeScript tài năng và tự tin hơn trong việc xây dựng các ứng dụng web mạnh mẽ.

Cùng chuyên mục:

Bài tập TypeScript: Classes và Inheritance trong Typescript

Bài tập TypeScript: Classes và Inheritance trong Typescript

Bài tập TypeScript: Các kiểu dữ liệu mảng và tuple.

Bài tập TypeScript: Các kiểu dữ liệu mảng và tuple.

Bài tập TypeScript: Kiểu Generic Types trong Typescript

Bài tập TypeScript: Kiểu Generic Types trong Typescript

Bài tập TypeScript: Lập trình Hướng đối tượng trong TypeScript

Bài tập TypeScript: Lập trình Hướng đối tượng trong TypeScript

Bài tập TypeScript: Các dạng bài tập cơ bản

Bài tập TypeScript: Các dạng bài tập cơ bản

Phân tích JSON trong TypeScript

Phân tích JSON trong TypeScript

Property trong TypeScript

Property trong TypeScript

Phần 2: Biến trong TypeScript

Phần 2: Biến trong TypeScript

Phần 1: Biến trong TypeScript

Phần 1: Biến trong TypeScript

Triple-Slash Directives trong TypeScript là gì?

Triple-Slash Directives trong TypeScript là gì?

Phân biệt Modules và Namespaces trong TypeScript

Phân biệt Modules và Namespaces trong TypeScript

Tìm hiểu Branded Type trong TypeScript

Tìm hiểu Branded Type trong TypeScript

Namespaces trong Typescript

Namespaces trong Typescript

Declaration Merging trong TypeScript

Declaration Merging trong TypeScript

Cách sử dụng @ts-expect-error trong typescript

Cách sử dụng @ts-expect-error trong typescript

5 ký hiệu khó hiểu cần biết trong TypeScript

5 ký hiệu khó hiểu cần biết trong TypeScript

Dependency Injection trong Typescript

Dependency Injection trong Typescript

Mapped Types trong TypeScript

Mapped Types trong TypeScript

5 Cách giúp bạn loại bỏ

5 Cách giúp bạn loại bỏ "any" trong TypeScript

Sử dụng Access Modifiers trong TypeScript

Sử dụng Access Modifiers trong TypeScript

Top