Tin được không, JavaScript sắp có type!?

Tin được không, JavaScript sắp có type!?

Tin ngắn hàng ngày dành cho bạn
  • Từ lâu rồi suy nghĩ làm thế nào để tăng sự hiện diện thương hiệu, cũng như người dùng cho blog. Nghĩ đi nghĩ lại thì chỉ có cách chia sẻ lên mạng xã hội hoặc trông chờ họ tìm kiếm, cho đến khi...

    In cái áo này được cái tắc đường khỏi phải lăn tăn, càng đông càng vui vì hàng trăm con mắt nhìn thấy cơ mà 🤓

    (Có tác dụng thật nha 🤭)

    » Xem thêm
  • Một vòng của sự phát triển nhiều dự án khá là thú vị. Tóm tắt lại trong 3 bước: Thấy một cái gì đó phức tạp -> Làm cho nó đơn giản đi -> Thêm thắt tính năng cho đến khi nó phức tạp... -> Quay trở lại vòng lặp mới.

    Tại sao lại như vậy? Để mình lấy 2 ví dụ cho các bạn thấy.

    Markdown ra đời với mục tiêu tạo ra một định dạng văn bản thô "dễ viết, dễ đọc, dễ dàng chuyển thành một dạng gì đó như HTML". Vì thời đó chẳng ai đủ kiên nhẫn mà vừa ngồi viết vừa thêm định dạng cho văn bản hiển thị ở trên web như thế nào. Ấy vậy mà giờ đây người ta đang "nhồi nhét" hoặc tạo ra các biến thể dựa trên markdown để bổ sung thêm nhiều định dạng mới đến mức... chẳng nhớ nổi hết cú pháp.

    React cũng là một ví dụ. Từ thời PHP, việc khát khao tạo ra một cái gì đó tách biệt hẳn giao diện người dùng và phần xử lý logic chính của ứng dụng thành 2 phần riêng biệt cho dễ đọc, dễ viết. Kết quả là các thư viện UI/UX phát triển rất mạnh mẽ, mang lại khả năng tương tác với người dùng rất tốt, còn phần logic ứng dụng thì nằm ở một máy chủ riêng biệt. Bộ đôi Front-end, Back-end cũng từ đấy mà thịnh hành, không thể thiếu anh bồi bàn REST API. Ấy vậy mà giờ đây React trông cũng không khác biệt gì so với PHP là mấy, kéo theo là cả Vue, Svelte... lại cùng quy tất cả về một mối.

    Cơ mà không phải vòng lặp là xấu, ngược lại vòng lặp này mang tính tiến hoá nhiều hơn là "cải lùi". Nhiều khi lại tạo ra được cái hay hơi cái cũ thế là người ta lại dựa trên cái hay đó để tiếp tục lặp. Nói cách khác là chắc lọc tinh hoa từng tí một tí một á 😁

    » Xem thêm
  • Song song với các dự án chính thức thì thi thoảng mình vẫn thấy các dự án "bên lề" nhằm tối ưu hoặc cải tiến ngôn ngữ theo khía cạnh nào đó. Ví dụ nature-lang/nature là một dự án hướng tới cải tiến Go, mang lại một số thay đổi nhằm giúp cho việc sử dụng Go trở nên thân thiện hơn.

    Nhìn lại mới thấy hao hao JavaScript 😆

    » Xem thêm

Vấn đề

Một trong những điều tôi thấy ấn tượng khi bắt đầu làm việc với JavaScript là nó không có type (dynamically typed). Có nghĩa là không cần khai báo kiểu dữ liệu cho tất cả mọi thứ tạo ra. Điều đó giúp cho thời gian viết mã nhanh hơn và thoải mái hơn. Ngược lại, việc không xác định trước kiểu dữ liệu cũng gây ra nhiều rắc lỗi trong việc gỡ lỗi và bảo trì dự án sau này.

Giữa lúc đó, TypeScript ra đời mang đến "statically typed" cho Javascript. Nghĩa là giờ đây bạn đã có thể khai báo kiểu cho hầu hết mọi thứ, tránh được nhiều lỗi khi viết mã hơn và mã trông có vẻ tường minh hơn rất nhiều. Về bản chất, TypeScript là một công cụ hỗ trợ kiểu cho JavaScript, sau đó nó biên dịch cú pháp của ts thành js để cho trình duyệt, Node.js... có thể hiểu và thực thi.

Gần đây TC39 đang ấp ủ một kế hoạch gọi là Type Annotations. Một bước tiến giúp cho JavaScript có thể khai báo kiểu. Đặc biệt hơn là cú pháp kiểu gần như là "cóp nhặt" từ TypeScript. Vậy điều gì đang xảy ra? Có phải JavaScript đang muốn "lấn sân" để trở thành một ngôn ngữ định kiểu? Điều đó có làm cho cộng đồng giận giữ khi giờ đây viết mã trở nên phức tạp và gò bó hơn? Hãy cùng tôi tìm hiểu qua bài viết dưới đây nhé!

TC39 và quy trình phát triển tính năng cho JavaScript

Trước tiên, hãy nói về TC39 và cách mà TC39 phát triển một tính năng mới cho JavaScript.

Ủy ban Ecma TC39 chịu trách nhiệm phát triển ngôn ngữ lập trình ECMAScript (JavaScript) và soạn thảo thông số kỹ thuật. TC39 hoạt động theo sự đồng thuận và có toàn quyền thay đổi thông số kỹ thuật khi thấy phù hợp. Tuy nhiên, có một quy trình chung để thực hiện các thay đổi thông số kỹ thuật.

Các thay đổi được hình thành từ mức ý tưởng cho đến khi chúng được thực sự triển khai thông qua nhiều bước nghiêm ngặt. Có năm giai đoạn: giai đoạn ý tưởng ban đầu và 4 giai đoạn tiếp sau đó. TC39 phải thông qua và nghiệm thu từng giai đoạn.

Type Annotations là một trong những nỗ lực đưa JavaScript đến gần với ngôn ngữ được định kiểu. Bước vào giai đoạn 1, nghĩa là Type Annotations đã vượt qua được vòng gửi xe. Ở giai đoạn này, nó phải mô tả được nhiều hơn những điều cần làm cũng như xác định được những thách thức tiềm tàng để đi tiếp vào các vòng tiếp theo. Khoảng thời gian này có lẽ còn dài nhưng hãy điểm lại xem với đặc tả này mang lại cho chúng ta điều gì nhé.

Type Annotations hoạt động như thế nào?

Đề xuất này nhằm mục đích cho phép các nhà phát triển thêm định kiểu vào mã JavaScript của họ, để cho các công cụ kiểm tra kiểu như TypeScript vẫn có thể hoạt động bình thường. Khi chạy, công cụ JavaScript bỏ qua các kiểu dữ liệu, coi đó chỉ như là chú thích. Type Annotations sinh ra không phải để thay thế TypeScript hay khác công cụ định kiểu khác. Nó sinh ra đề trả lời cho câu hỏi "JavaScript nên hoạt động như thế nào khi có type".

Cụ thể hơn là cho phép các nhà phát triển chạy các chương trình được viết bằng TypeScript, Flow... và các công cụ định kiểu khác cho JavaScript mà không cần dịch mã, với điều kiện các ngôn ngữ định kiểu này phải nằm trong tập con của định nghĩa Type Annotation hỗ trợ.

Ví dụ:

let str:string = "hello world";
str = 5;

Nếu chạy trong môi trường JavaScript, đoạn mã khi vẫn chạy bình thường, JavaScript không quan tâm đến type của str nên nó vừa có thể là string nhưng gán lại bằng một số vẫn không sao. Tuy nhiên, nếu compile bằng TypeScript một lỗi sẽ xuất hiện cảnh báo việc gán một kiểu number cho string là không hợp lệ.

Hiện tại, có nhiều đề xuất cho Type Annotations. Chúng cố gắng làm sao cho giống với TypeScript nhất có thể, vì điều này là cách tốt nhất để hỗ trợ "kiểu" cho JavaScript mà vẫn tương thích với TypeScript.

Một số ví dụ có thể kể đến như:

Biến kiểu:

let x: string;

Type:

type CoolBool = boolean;

Interface:

interface Person {
    name: string;
    age: number;
}

Export:

export interface Person {
    name: string;
    age: number;
}
export type { SomeLocalType };
export type { SomeType as AnotherType } from "some-module";

Và còn nhiều định nghĩa khác. Để xem chi tiết, bạn đọc có thể truy cập vào trang mô tả của Type Annotations.

Nếu TypeScript đã đủ tốt vậy tại sao phải sinh ra Type Annotations?

Thứ nhất, phải nói rằng TypeScript không phải là JavaScript, vì thế nó không chịu sự quản lý của TC39.

Thứ hai, điều mà cộng đồng yêu cầu nhiều nhất ở JavaScript là khả năng hỗ trợ kiểu. Theo các cuộc khảo sát về Javascript trong năm 20202021 thì nó luôn nằm trong top đầu về điều mà các nhà phát triển muốn nhất.

khảo sát JavaScript

Tuy nhiên, TypeScript đã làm rất tốt việc định kiểu này - nó đã được sử dụng rất rộng rãi với nhiều tín hiệu cho thấy mọi người muốn tiếp tục sử dụng nó. Nếu TC39 làm một thứ hoàn toàn mới thì liệu có gây khó dễ cho cộng đồng phát triển?

Vì lẽ đó, có thể họ muốn tìm một giải pháp để dung hòa giữa cộng đồng và các ngôn ngữ định kiểu dựa trên JavaScript. Vốn đã phát triển rất mạnh mẽ, JavaScript không thể tự ý thay đổi tất cả mọi thứ để đưa nó thành ngôn ngữ định kiểu, cũng như không muốn phải tự mình "phát minh lại bánh xe".

Nếu điều đó thành hiện thực, giờ đây TypeScript có thể chạy trực tiếp trong trình duyệt mà không cần qua bước "build" thành JavaScript nữa, giúp tối ưu hóa đáng kể trải nghiệm của nhà phát triển.

Đồng thời, đây cũng là cơ sở tiêu chuẩn để định kiểu cho Javascript. Bằng cách tiêu chuẩn hóa kiểu dữ liệu, nó sẽ làm cơ sở cho tất cả các trình biên dịch kiểu, giúp mọi việc trở nên dễ dàng hơn đối với các nhà phát triển.

Tổng kết

TC39 chịu trách nhiệm phát triển ngôn ngữ lập trình JavaScript. Những tính năng mới phải vượt qua 5 vòng để đi vào triển khai trong thực tế. Gần đây, Type Annotations như một nỗ lực nhằm mang lại định kiểu dữ liệu cho JavaScript, nhưng với một cách "thoải mái" hơn chứ không phải gò bó. Các bạn nghĩ sao về vấn đề này, còn tôi thì thấy đây là một điều rất đáng để chờ đợi. Vì vẫn còn nhiều thay đổi cho đến khi Type Annotations được đưa vào chính thức, chỉ mong sao nó đủ tốt để giảm bớt sự phức tạp của các công cụ định kiểu.

Cao cấp
Hello

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Trịnh Cường2 năm trước

java is da bet@gif [MVDPX3gaKFPuo]

Trả lời