Bài 2: Type, Static Type-Checking
Chào các bạn trở lại với series học 15 phút mỗi ngày cùng yeulaptrinh.vn, ở bài học này, chúng ta sẽ học về Type trong các ngôn ngữ lập trình, giải thích cho các bạn mới tiếp cận với data type, cũng như static type checking trong TypeScript . Chúng ta cùng bắt đầu nhé.
Nội dung của bài
Type và tầm quan trọng của nó?
Type là gì?
Kiểu dữ liệu, data type hay ta còn gọi là type là một cách phân loại dữ liệu cho trình biên dịch hoặc thông dịch hiểu các lập trình viên muốn sử dụng loại dữ liệu nào. Hoặc có thể hiểu cách đơn giản, nó là một cách phân loại và chỉ định kiểu giá trị nào mà một biến, một phép toán, một quan hệ hoặc một logic nào có thể sử dụng khi chúng ta gán mà không xảy ra lỗi. Ví dụ như chúng chúng ta sử dụng string là kiểu dữ liệu để phân loại văn bản hay boolean là kiểu dữ liệu dùng cho việc phân loại các logic.
Type quan trọng như thế nào?
Nghe có hơi chút mơ hồ nhỉ, vậy mình sẽ mô tả theo một cách khác nhé. Ví dụ bạn cần xây một ngôi nhà, bạn cần phải biết được chính xác ngôi nhà sẽ xây gì ở chỗ nào, ví dụ bức tường phòng ngủ xây bằng gạch, vậy bạn phải biết chính xác gạch là loại gì, lắp như thế nào, chỗ nào lắp gạch gì, chỗ nào dùng vữa, chỗ nào dùng thép… Nếu sử dụng sai vật liệu, bức tường có thể sẽ bị hỏng hóc sau này, hoặc thậm chí không thể xây lên được, dẫn tới sụp đổ cả căn nhà.
Tương tự với với việc xây dựng một phần mềm, bạn cần phải hình dung được các tính năng sẽ được xây dựng như thế nào, ở tính năng này thì cần những loại dữ liệu gì và phải sử dụng chính xác loại dữ liệu đó nếu không nó sẽ dẫn tới lỗi không đáng có, và có thể cả ứng dụng sẽ không hoạt động được. Lúc này đây thì trình biên dịch / thông dịch sẽ đứng ra như một kỹ sư giám sát công trình, sẽ kiểm tra xem các viên gạch, các vật liệu có chính xác hay không hay các kiểu dữ liệu sử dụng cho các tính năng có chính xác hay không.
Ngoài ra, việc khai báo kiểu dữ liệu cũng quan trọng trong việc cấp bộ nhớ, với mỗi kiểu dữ liệu cụ thể thì lại cần một lượng bộ nhớ nhất định, các data types sẽ báo cho cho đơn vị quản lý bộ nhớ ( MMU – Memory Management Unit) biết rằng nó cần bao nhiêu bộ nhớ trước khi chương trình biên dịch. Phần này mình sẽ không đi vào chi tiết, các bạn có thể tìm hiểu thêm từ các bài viết trên yeulaptrinh.vn nhé
Statically typed language và Dynamically typed language
Các ngôn ngữ lập trình được chia làm hai loại: statically typed language hoặc dynamically typed language
Statically typed language
Trong Statically Typed language hay còn gọi là Strong typed language, kiểu của biến phải được biết tại thời điểm biên dịch. Nếu chúng ta khai báo một biến, nó sẽ được trình biên dịch biết (hoặc có thể suy luận được) nếu nó sẽ là một số, một chuỗi hoặc một boolean. Các ngôn ngữ thường gặp: Java, C/C++, Go..
=> các lỗi sẽ được phát hiện sớm, ngôn ngữ sẽ chặt chẽ hơn, các biến sẽ không bị đổi kiểu linh tinh, hiệu năng cũng sẽ được đảm bảo hơn do không cần phải xác định lại kiểu cho biến
Dynamically typed language
Ngược lại với statically typed language, dynamic typed language cho phép biến thay đổi tuỳ ý. Ví dụ với Javascript, python, PHP.. Các kiểu của các biến được tự do gán và chúng được xác định vào lúc runtime chứ không phải trong thời gian biên dịch
=> việc code sẽ thoải mái hơn, đơn giản hơn, code sẽ ngắn hơn và đơn giản hơn
Như thế ta có thể thấy, JavaScript chính là một Dynamically typed language, tuy nhiên nếu sử dụng TypeScript để viết JavaScript thì nó sẽ mang lại các đặc tính của Statically typed language.
Static Type-checking
Khi code javascript chắc hẳn các bạn đã gặp rất nhiều lỗi như dưới đây
hay là
hoặc là
Những lỗi trên là đặc trưng của dynamic typing, chúng xảy ra khi chúng ta sử dụng sai các thuộc tính, các behavior của các biến, và đặc biệt hơn là chúng chỉ xảy ra trong quá trình runtime, trong lúc code chúng ta không phát hiện được việc này, vì thế để khắc phục việc này , TypeScript đã cung cấp một tool / cơ chế để có thể tìm những lỗi như thế này trước khi code chạy, gọi là static type-checking.
Cách thức hoạt động: khi chúng ta sử dụng một biến, nó sẽ hiểu được kiểu của biến dữ liệu của mình là gì => biết chúng có những thuộc tính nào, những phương thức nào => gợi ý các phương thức, thuộc tính liên quan và báo lỗi khi chúng ta sử dụng sai.
Để làm rõ hơn, chúng ta cùng vào một ví dụ cụ thể nhé.
Bài viết trước mình đã hướng dẫn các bạn cách cài đặt môi trường cho TypeScript bằng Visual Studio, từ bài học này trở đi chúng ta sẽ sử dụng Visual Studio Code để thực hành nhé.
Chúng ta bắt đầu nhé
Ta có thể thấy rằng, khi chúng ta code, gọi hằng greeting như một hàm, thì nó đã báo lỗi ngay không cần phải chờ đến lúc compile code hay là runtime nữa.
Lợi ích của Static Type-checking
- Chúng ta có thể phát hiện bug ngay khi code, đỡ tốn thời gian để debug.
- Các biến khai báo, các type sẽ được kiểm tra một cách tự động, cho nên nếu trong một dự án có một người mới vào tham gia thì sẽ dễ dàng hơn trong việc tiếp cận, maintaince dự án.
- Cùng với hỗ trợ của các IDE, text editor, chúng ta sẽ tiết kiệm được rất nhiều thời gian trong việc viết code.
Điểm hạn chế của Static Type-checking
- Khá là rối và cần thời gian thích nghi cho những bạn nào đã quen code bằng JavaScript. Cảm tưởng nếu trước đây viết một cách tự do thì bây giờ phải chú ý nếu không thì sẽ bị báo lỗi khắp nơi :p
- Nó không thể kiểm soát hay báo lỗi của data type trong quá trình runtime, ví dụ khi fetch data từ một API bên ngoài vào. Cái này sẽ liên quan đến phần Runtime Type Checking mình sẽ nói rõ ở những bài viết sau nhé.
Non-exception Failures & Types for Tooling
Một số lỗi điển hình được kiểm soát như:
- Băt buộc phải trả đúng giá trị, nếu không thì sẽ thông báo lỗi
- Lỗi chính tả, đánh máy – tự động sửa tên hàm, tên field nếu gõ sai chính tả
- Lỗi khai báo sai thuộc tính, sai type
- Lỗi về logic cơ bản
- etc..
Ngoài việc thông báo lỗi trong khi typing, TypeScript cũng có các cơ chế giúp hạn chế lỗi ngay từ ban đầu điển hình như:
- Tự động suggest tên các thuộc tính, các behavior:
- Tự động gợi ý giá trị cho các thuộc tính
- etc..
Summary
Bài viết này mình đã giải thích cho các bạn về Type trong lập trình, tầm quan trọng của nó, để từ đó các bạn thấy được những nâng cấp đáng giá mà TypeScript mang đến cho JavaScript.
Bên cạnh đó mình cũng đã giới thiệu qua cho các bạn về static type-checking trong TypeScript, về cơ chế hoạt động, những ví dụ điển hình, các case tiêu biểu. Trong thực tế khi làm dự án, các bạn sẽ gặp rất nhiều rất nhiều trường hợp nữa, bạn sẽ thấy sự tiện dụng của nó như thế nào. Nếu có ví dụ nào hay hoặc ứng dụng nào của nó hay hơn nữa thì hãy comment ở phía dưới để chúng ta cùng trao đổi nhé. Rất mong nhận được sự đóng góp từ các bạn.
Tham khảo: https://www.typescriptlang.org/docs/handbook/2/basic-types.html