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

Sử dụng Function Overloadings trong TypeScript

Mục tiêu của bài viết này là tìm hiểu về Function Overloadings trong TypeScript, một tính năng mạnh mẽ cho phép mình định nghĩa nhiều phiên bản của một hàm với các đặc điểm kiểu dữ liệu đầu vào và đầu ra khác nhau. Function Overloadings giúp kiểm tra kiểu dữ liệu mạnh mẽ, đảm bảo tính bảo mật của mã nguồn, và tạo sự rõ ràng và dễ hiểu trong việc giao tiếp về kiểu dữ liệu của hàm.

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.

Mình sẽ bắt đầu với khái niệm cơ bản về Function Overloadings và sau đó tìm hiểu về cú pháp và cách sử dụng chúng. Sau đó, bài viết sẽ điểm qua lợi ích và hạn chế của việc sử dụng Function Overloadings, cùng với một số quy tắc quan trọng khi áp dụng chúng. Cuối cùng, sẽ thấy cách Function Overloadings có thể được sử dụng trong các tình huống thực tế thông qua các ví dụ minh họa cụ thể.

Function Overloadings trong TypeScript

Function Overloadings (viết tắt là Overloads) là một tính năng trong TypeScript cho phép mình định nghĩa nhiều phiên bản của một hàm với các chữ ký khác nhau. Mỗi phiên bản hàm overload có thể chấp nhận các loại đối số và kiểu trả về khác nhau. TypeScript sẽ dựa vào kiểu dữ liệu đầu vào của cuộc gọi hàm để xác định phiên bản overload nào phải được sử dụng.

Cú pháp của Function Overloadings

function functionName(arg1: type1, arg2: type2): returnType1;
function functionName(arg1: type3, arg2: type4): returnType2;
// ...

Trong đó:

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

  • functionName là tên của hàm.
  • arg1, arg2, type1, type2, ... là các tham số đầu vào và kiểu dữ liệu của chúng cho phiên bản overload thứ nhất.
  • arg1, arg2, type3, type4, ... là các tham số đầu vào và kiểu dữ liệu của chúng cho phiên bản overload thứ hai.
  • returnType1, returnType2, ... là kiểu dữ liệu mà phiên bản overload tương ứng sẽ trả về.

Để minh họa, dưới đây là một ví dụ về việc sử dụng Function Overloadings để định nghĩa một hàm tính tổng hoặc nối các giá trị:

function combine(a: string, b: string): string;
function combine(a: number, b: number): number;
function combine(a: any, b: any): any {
  return a + b;
}

Ở đây, mình đã định nghĩa hai phiên bản của hàm combine. Phiên bản đầu tiên là cho các tham số kiểu string và trả về kiểu string, trong khi phiên bản thứ hai dành cho các tham số kiểu number và trả về kiểu number. Các cuộc gọi hàm sẽ dựa vào kiểu dữ liệu của đối số để xác định phiên bản overload thích hợp:

const result1 = combine("Hello, ", "world"); // result1: string
const result2 = combine(5, 3); // result2: number

Dùng Function Overloadings giúp làm cho mã nguồn dễ đọc và dễ hiểu, đồng thời đảm bảo kiểm tra kiểu dữ liệu mạnh mẽ và an toàn.

Sử dụng Function Overloadings trong TypeScript

Cú pháp của Function Overloadings đã được đề cập ở trên. Bây giờ mình sẽ xem xét một số ví dụ cụ thể về cách sử dụng Function Overloadings và cú pháp cơ bản.

Ví dụ 1: Hàm pad

Mình sẽ xây dựng một hàm pad cho phép chèn các ký tự vào một chuỗi để có chiều dài nhất định. Hàm này sẽ có một phiên bản overload cho việc chèn ký tự vào đầu chuỗi và một phiên bản cho việc chèn ký tự vào cuối chuỗi.

function pad(value: string, padding: number): string;
function pad(value: string, padding: number, padStart: boolean): string;
function pad(value: string, padding: number, padStart: boolean = false): string {
  if (padStart) {
    return padding.toString().repeat(padding) + value;
  } else {
    return value + padding.toString().repeat(padding);
  }
}

Các phiên bản overload của hàm pad có sự khác biệt ở tham số thứ ba, là padStart, để xác định xem muốn chèn vào đầu chuỗi hay cuối chuỗi. Mình đã mặc định giá trị false cho tham số này.

Ví dụ 2: Hàm formatDate

Xem xét một hàm formatDate để định dạng ngày tháng thành chuỗi dạng văn bản. Ta có thể sử dụng Function Overloadings để cho phép chấp nhận đối số là một đối tượng Date hoặc ba giá trị số (ngày, tháng, năm).

function formatDate(date: Date): string;
function formatDate(day: number, month: number, year: number): string;
function formatDate(arg1: Date | number, arg2?: number, arg3?: number): string {
  if (arg1 instanceof Date) {
    return `${arg1.getDate()}/${arg1.getMonth() + 1}/${arg1.getFullYear()}`;
  } else {
    return `${arg1}/${arg2}/${arg3}`;
  }
}

Trong ví dụ này, phiên bản overload đầu tiên chấp nhận một đối tượng Date, trong khi phiên bản thứ hai chấp nhận ba giá trị số là ngày, tháng, và năm.

Ví dụ 3: Hàm find

Mình cũng có thể sử dụng Function Overloadings để định nghĩa nhiều cách sử dụng cho hàm find trong một danh sách.

function find<T>(list: T[], callback: (item: T) => boolean): T | undefined;
function find<T, K extends keyof T>(
  list: T[],
  key: K,
  value: T[K]
): T | undefined;
function find<T>(list: T[], arg1: any, arg2?: any): T | undefined {
  if (typeof arg1 === "function") {
    for (const item of list) {
      if (arg1(item)) {
        return item;
      }
    }
  } else if (typeof arg1 === "string" && arg2 !== undefined) {
    for (const item of list) {
      if (item[arg1] === arg2) {
        return item;
      }
    }
  }
  return undefined;
}

Trong ví dụ này, mình có hai phiên bản overload cho hàm find. Phiên bản thứ nhất chấp nhận một danh sách và một hàm callback để tìm kiếm một phần tử thỏa mãn. Phiên bản thứ hai cho phép tìm theo giá trị của một trường trong các đối tượng trong danh sách.

Như vậy, Function Overloadings cho phép mình định nghĩa nhiều cách sử dụng cho một hàm và làm cho mã nguồn dễ đọc và dễ hiểu hơn.

Lợi ích và hạn chế của việc sử dụng Function Overloadings

Lợi ích

Kiểm tra kiểu dữ liệu mạnh mẽ

Function Overloadings giúp bạn kiểm tra kiểu dữ liệu một cách mạnh mẽ, đảm bảo rằng bạn đang sử dụng hàm với đúng kiểu tham số và kiểu kết quả. TypeScript sẽ cung cấp cảnh báo lỗi khi bạn vi phạm các quy tắc overload.

Tính bảo mật và đọc mã nguồn dễ hiểu hơn

Bằng cách cung cấp các phiên bản overload, bạn làm cho mã nguồn dễ đọc hơn và hiểu hơn. Các đồng nghiệp của bạn có thể dễ dàng đọc và hiểu cách sử dụng hàm mà bạn định nghĩa.

Hạn chế

Quy tắc về số lượng và thứ tự phiên bản hàm

TypeScript đòi hỏi rằng số lượng phiên bản overload phải trùng với số lượng tham số trong phiên bản implement, và thứ tự của các phiên bản overload phải khớp với thứ tự của các tham số.

Sử dụng Function Overloadings một cách hợp lý

Overload không nên được sử dụng quá phức tạp hoặc vô lý. Hãy sử dụng chúng để xử lý các trường hợp đặc biệt hoặc kiểu dữ liệu cụ thể.

Hạn chế của Function Overloadings

Function Overloadings không thể được sử dụng để kiểm tra logic thực thi trong hàm. Chúng chỉ định nghĩa kiểu dữ liệu của đối số và kết quả.

Kết bài

Trong bài viết này, mình đã tìm hiểu về Function Overloadings trong TypeScript, một tính năng mạnh mẽ giúp kiểm tra kiểu dữ liệu một cách mạnh mẽ và làm cho mã nguồn dễ đọc hơn. Mình đã xem xét cú pháp và cách định nghĩa Function Overloadings, cùng với các lợi ích và hạn chế khi sử dụng chúng.

Function Overloadings giúp mình xây dựng mã nguồn linh hoạt và bảo đảm tính chính xác của kiểu dữ liệu, đặc biệt trong các trường hợp đặc biệt hoặc khi cần xử lý nhiều kiểu dữ liệu khác nhau. Việc sử dụng chúng cũng giúp mã nguồn dễ đọc và hiểu hơn cho đồng nghiệp và người khác sử dụng.

Tuy nhiên, cũng cần tuân theo quy tắc về số lượng và thứ tự phiên bản hàm, sử dụng Function Overloadings một cách hợp lý và nhớ rằng chúng chỉ định nghĩa kiểu dữ liệu và không kiểm tra logic thực thi trong hàm.

Hy vọng rằng sau bài viết này, bạn đã có cái nhìn rõ ràng hơn về cách sử dụng Function Overloadings để tối ưu hóa mã nguồn TypeScript của mình.

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

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

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

Top