📄️ Khai báo biến: let và const
Variable declaration trong JavaScript có let và const.
📄️ Type annotation trong khai báo biến
Trong TypeScript, khi khai báo biến, bạn có thể chỉ định giá trị nào có thể được gán cho biến đó. Chỉ định này được gọi là type annotation (chú thích kiểu). Type annotation trong khai báo biến được viết bằng cách đặt kiểu ở bên phải tên biến như sau:
📄️ Không nên sử dụng var nữa
var là cách khai báo biến cũ. var có một số vấn đề. Để giải quyết những vấn đề đó, let và const đã được giới thiệu trong ES2015. Ở đây, chúng ta sẽ giải thích về var và các vấn đề của nó. Khi viết code mới, khuyến nghị sử dụng let và const thay vì var.
📄️ Type inference trong khai báo biến
TypeScript có tính năng gọi là type inference (suy luận kiểu). Type inference là tính năng cho phép compiler tự động xác định kiểu. Lập trình viên có thể tận dụng type inference để bỏ qua type annotation, giảm lượng code cần viết.
📄️ Sự khác biệt giữa type inference và dynamic typing
Về mặt không viết kiểu, các ngôn ngữ dynamic typing như JavaScript, Ruby, PHP cũng tương tự. Vậy type inference và dynamic typing khác nhau như thế nào?
📄️ Kiểu primitive
Data type trong JavaScript được phân loại thành primitive type và object.
📄️ Kiểu boolean
Kiểu boolean trong JavaScript là type bao gồm các giá trị logic true và false.
🗃️ Kiểu number
1 mục
📄️ Kiểu string
String literal
📄️ Kiểu null
null trong JavaScript là giá trị biểu thị không có giá trị.
📄️ Kiểu undefined
undefined trong JavaScript là giá trị primitive biểu thị chưa được định nghĩa. Xuất hiện khi biến chưa được gán giá trị, hàm không có return value, truy cập property không tồn tại trong object, truy cập index không tồn tại trong array, v.v.
📄️ Sự khác biệt giữa undefined và null
Trong nhiều ngôn ngữ lập trình, cách biểu thị "không có giá trị" chỉ có một cách như null. Tuy nhiên, JavaScript có 2 cách biểu thị "không có giá trị" là null và undefined. Đây là điều khiến những người từ ngôn ngữ khác chuyển sang JavaScript ngạc nhiên và phân vân về cách sử dụng. Ở đây, chúng ta sẽ giải thích sự khác biệt trong specification giữa null và undefined, và cách sử dụng chúng trong thực tế.
📄️ Kiểu symbol
Kiểu symbol trong JavaScript là một loại primitive type, giá trị của nó là duy nhất. Kiểu boolean hay kiểu number nếu giá trị giống nhau thì so sánh bằng sẽ là true. Ngược lại, symbol ngay cả khi tên giống nhau nhưng nơi khởi tạo khác nhau thì sẽ là false.
📄️ Kiểu bigint
Kiểu bigint trong JavaScript là primitive type có thể xử lý số nguyên lớn hơn kiểu number.
📄️ Type coercion
JavaScript có data type, nhưng có những trường hợp khi thực hiện phép toán với hai giá trị khác kiểu mà không gây lỗi. Ví dụ, khi trừ kiểu number 1 từ kiểu string "1", kết quả là kiểu number 0.
📄️ Boxing
Trong nhiều ngôn ngữ, primitive thường không có field hay method. Để xử lý primitive như object, cần chuyển đổi primitive sang object. Việc chuyển đổi từ primitive sang object được gọi là boxing.
📄️ Kiểu literal
TypeScript cho phép biểu diễn kiểu mà chỉ có thể gán một giá trị cụ thể của primitive type. Kiểu như vậy được gọi là literal type.
📄️ Kiểu any
Kiểu any trong TypeScript là kiểu cho phép gán bất kỳ giá trị nào. Dù là primitive type hay object, bạn có thể gán gì vào cũng không gây lỗi.
🗃️ Object
15 mục
📄️ Structural typing
Đối với ngôn ngữ lập trình, hệ thống kiểu là một chủ đề quan trọng. Hệ thống kiểu là tập hợp các quy tắc gán "kiểu" cho các giá trị và biến khác nhau trong chương trình. Những quy tắc này quyết định tính chất và cách xử lý dữ liệu. Đặc biệt, cách phân biệt giữa các kiểu và ngược lại, cách xác định tính tương thích giữa các kiểu là chủ đề liên quan trực tiếp đến tính dễ sử dụng và an toàn của ngôn ngữ.
🗃️ Array
10 mục
📄️ Tuple
Function của TypeScript chỉ có thể trả về 1 giá trị. Tuy nhiên, thực tế có lúc muốn trả về nhiều giá trị. Trong trường hợp đó, có thể đặt tất cả giá trị muốn trả về vào mảng và return.
🗃️ Enum
3 mục
📄️ Union type
Union type trong TypeScript là cách biểu diễn "một trong các kiểu".
📄️ Discriminated union
Discriminated union của TypeScript là union type đặc biệt, có "dấu hiệu" để phân biệt từng kiểu object trong union. Khi thu hẹp union type gồm các kiểu object mà logic phân nhánh phức tạp, sử dụng discriminated union sẽ cải thiện khả năng đọc và bảo trì code.
📄️ Intersection type
Khái niệm này đối lập với union type. Nếu union type có nghĩa một trong các thì intersection type có nghĩa tất cả. Nói cách khác, nó chỉ việc kết hợp các định nghĩa object.
📄️ Type alias
TypeScript cho phép đặt tên cho kiểu. Kiểu có tên được gọi là type alias.
📄️ Type assertion "as"
TypeScript có tính năng ghi đè type inference. Tính năng này được gọi là type assertion.
📄️ Const assertion "as const"
Khi khai báo biến, thêm as const vào cuối sẽ làm cho giá trị đó thành readonly và chuyển thành literal type.
📄️ Toán tử satisfies
satisfies T (T là type) là toán tử sử dụng khi khai báo biến, dùng để kiểm tra xem giá trị đó có thỏa mãn type T không. Đặc điểm của toán tử này là có thể thực hiện type check trong khi vẫn giữ được việc thu hẹp type.
📄️ Definite assignment assertion
Definite assignment assertion là toán tử cho compiler TypeScript biết rằng biến hoặc property chắc chắn đã được khởi tạo.
📄️ Toán tử typeof
Toán tử typeof của JavaScript cho phép kiểm tra kiểu của giá trị.
📄️ Equality (sự bằng nhau)
Trong bất kỳ ngôn ngữ nào, đều có lúc cần so sánh giá trị. Trong JavaScript, có hai toán tử so sánh bằng là toán tử bằng (==) và toán tử bằng nghiêm ngặt (===). Lý do có hai toán tử để kiểm tra bằng nhau là vì không phải lúc nào cùng một thứ cũng được coi là bằng nhau.
📄️ Giá trị truthy và falsy
Muốn thay đổi xử lý theo điều kiện cụ thể
📄️ Mental model của kiểu
Lý thuyết nền tảng của hệ thống kiểu