- vừa được xem lúc

Hiểu về khái niệm "The constructor of the class" trong Typescript

0 0 23

Người đăng: Hoàng Huy Toàn

Theo Viblo Asia

Lời mở đầu:

Khi đang tìm hiểu về decorators trong Typescipt, thì tôi bỗng bắt gặp 1 khái niệm

Class Decorator is declared just before a class declaration. The class decorator is applied to the constructor of the class and can be used to observe, modify, or replace a class definition. A class decorator cannot be used in a declaration file, or in any other ambient context (such as on a declare class).>

The expression for the class decorator will be called as a function at runtime, with the constructor of the decorated class as its only argument.

If the class decorator returns a value, it will replace the class declaration with the provided constructor function.

Nguồn

Đại khái là Class Decor apply trên "constructor of the class", được gọi lúc runtime và nhận "constructor of the class" là đối số duy nhất. Nếu Class Decor trả về 1 giá trị, nó sẽ thay thế Class với constructor function mới

Điều làm tôi thắc mắc không hiểu "constructor of the class" nó là thứ gì? Nó có phải là method constructor mà ta khai báo khi định nghĩa 1 class hay không? Kí hiệu về kiểu (type annotation) của nó là gì?

Bài viết sau là kết quả tôi đi tìm hiểu lời giải cho khái niệm này.

Class và Function trong Javascript

Đầu tiên thì Class trong Javascript thực chất là 1 Function. Function thực chất lại là 1 Object

In fact, mọi đối tượng trong JS đều bắt nguồn từ đối tượng gốc Object. Loại đối tượng duy nhất không bắt nguồn từ Object, đó là bọn có prototypenull (kiểu ngang hàng với Object 😄)

Vậy điểm khác nhau giữa ClassFunction thông thường là gì?

Đó là Class là constructible function nhưng không callable (nếu call như function bình thường sẽ báo TypeError). Còn các function khác thì vừa constructible vừa callable (trừ arrow function, chỉ có thể call mà không thể construct). Vậy thực ra Class chỉ đơn giản chỉ là 1 constructor function, nhưng có cách khai báo khác với function thông thường mà thôi (cho phù hợp với các ngôn ngữ OOP khác).

Đọc kĩ định nghĩa ở lời mở đầu có thể thấy, hàm decor class return 1 constructor function có thể thay thế class gốc → đối số được truyền vào chẳng phải chính là Class gốc đó sao!

Vậy khái niệm mà Typescript nhắc tới "the constructor of the decorated class" thực ra chính là class đó. Nó là 1 function chỉ có thể construct mà thôi!

Type Annotation của Constructor Function

Sau khi đã hiểu đối số truyền vào class decor là một construct-only function (class), việc tiếp cần làm đó là viết type cho nó.

Constructor Function, khi dùng với new, sẽ return 1 object có type là class đó

Vậy có thể mô tả function này trong typescript như sau:

class A {}
type ConstructorFunctionOfClassA = new () => A // nếu muốn linh hoạt hơn thì có thể dùng generic
type ConstructorFunctionOfClassX<X> = new () => X // và ta được kết quả tương tự
type ConstructorFunctionOfClassA = ConstructorFunctionOfClassX<A>

Cũng như các function khác, vốn là 1 object, Class hay cái function mà “constructible nhưng không callable được” kia cũng có thể "viết" dưới dạng 1 object như sau:

class A {} // dạng object của nó
{
length: number,
name: string,
arguments: ...,
caller: ...,
prototype: object
// còn rất nhiều property ẩn khác tương tự các functions khác
}

Điều này dẫn đến việc, nếu ta muốn mô tả function này bằng dạng object, có thể dùng interface hoặc type như sau

interface ConstructorFunctionOfClassA {
length: number,
name: string,
new ():A
} // hoặc dùng
type ConstructorFunctionOfClassA = {
length: number,
name: string,
new ():A
}

2 cách khai báo type trên sử dụng cú pháp Construct Signatures trong typescript để mô tả 1 object có thể construct được (mà không call được), và type của object return sau khi construct là gì. Ngoài ra còn có cú pháp Call Signatures (bỏ new đi) nữa.

Cuối cùng, để mô tả Class hay cái function mà “constructible nhưng không callable được” kia có thể có số lượng tham số tùy ý, cần sử dụng rest params

type ConstructorFunctionOfClassX<X> = new (...arg: any[]) => X
// or
interface ConstructorFunctionOfClassX<X> { new (...arg: any[]): X }
// or
type ConstructorFunctionOfClassX<X> = { new (...arg: any[]): X }

Tổng kết

Cuối cùng, sau khi mò mẫm, theo ý hiểu của mình, tôi đi đến kết luận:

  1. Class là 1 construct-only function, và nó có 1 type riêng. Còn object mà tạo ra từ nó, có type là tên của Class đó
  2. Thứ truyền vào hàm decor 1 class, không phải là method constructor khi khai báo Class, mà chính là Class hay construct-only function ấy

Tham khảo: https://www.typescriptlang.org/docs/handbook/decorators.html#class-decorators https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

- vừa được xem lúc

Type annotation vs Type Inference - Typescript

Trong bài viết này, chúng ta sẽ tìm hiểu kỹ về TypeScript bằng cách tìm hiểu sự khác biệt giữa kiểu chú thích và kiểu suy luận. Tôi sẽ cho rằng bạn có một số kinh nghiệm về JavaScript và biết về các kiểu cơ bản, như chuỗi, số và boolean.

0 0 45

- vừa được xem lúc

Type Annotation và Type Inference trong TypeScript là gì?

Khi làm việc với javascript chắc hẳn các bạn đã quá quen với việc dùng biến mà không cần phải quan tâm đến kiểu dữ liệu của nó là gì phải không? Đúng là mới đầu tiếp cận với Typescript mình cũng cảm thấy nó khá là phiền vì cần phải khai báo đủ type để nó chặt chẽ hơn. Lúc đó mình còn nghĩ: " JavaScr

0 0 37

- vừa được xem lúc

Tìm hiểu TypeScript và kiến thức cơ bản

TypeScript là gì. TypeScript sử dụng tất cả các tính năng của của ECMAScript 2015 (ES6) như classes, modules.

0 0 53

- vừa được xem lúc

TypeScript - P1: Vì sao TypeScript được yêu thích đến vậy?

Trải nghiệm thực tế. Trước khi là một Web Developer, tôi là một Mobile Developer và Java là thứ mà tôi từng theo đuổi.

0 1 69

- vừa được xem lúc

4 Tính năng rất hay từ TypeScript

Xin chào các bạn hôm nay mình xin chia sẽ những tính năng rất hay của TypeScript (TS), các bạn cùng tìm hiểu nhé. Ngoài việc set Type cho biến, tham số hay function thì ví dụ khi bạn nhìn vào một tham

0 0 96