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
  • Hôm qua đến nay, lượt truy cập tới từ Facebook tăng đột biến. Thường như thế là do ai đó chia sẻ bài viết của blog vào một nhóm nào đó.

    Cơ mà lần này là liên kết trực tiếp đến trang chủ luôn. Tò mò ghê, không biết ai chia sẻ, chia sẻ ở đâu nữa. Muốn biết để tìm hiểu "insight" ghê 🥹

    » Xem thêm
  • Mình mới phát hiện ra thư viện idb-keyval giúp triển khai cơ sở dữ liệu dạng key-value một cách đơn giản. Như đã chia sẻ trong chuỗi bài viết về quá trình làm OpenNotas, mình loay hoay đi tìm một loại cơ sở dữ liệu để lưu trữ mà xem chừng vất vả quá, cuối cùng chốt localForage.

    idb-keyval cũng tương tự như localForage nhưng có vẻ như nó đang làm tốt hơn một chút. Đơn cử là có hàm update để cập nhật dữ liệu, hình dung đơn giản là:

    update('counter', (val) => (val || 0) + 1);

    Chứ không như hàm set là thay thế dữ liệu mất tiêu luôn.

    » Xem thêm
  • Đầu xuân năm mới, xin phép khoe số tiền kiếm được sau 1 tháng đặt quảng cáo tại indieboosting.com 🥳🥳🥳

    » 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ường1 năm trước
java is da bet@gif [MVDPX3gaKFPuo]
Trả lời
Bấm hoặc cuộn mạnh để sang bài mới