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
  • Void - cái tên mình đã nhắc đến từ cách đây khá lâu. Từ đợt mà continue.dev mới nổi lên á. Nó tương tự như Cursor và Windsurf, mới hôm nay họ đã phát hành phiên bản Beta và cho phép mọi người tải xuống.

    Điểm mạnh thì đây là nguồn mở, miễn phí, dùng các mô hình miễn phí cục bộ trên máy qua Ollama hoặc LM Studio... Không thích thì cắm API của bên khác vào cũng được. Mình vừa dùng thử thì thấy khả năng gợi ý và khung chat khá tương đồng với Cursor, có cả tính năng Agent luôn nhé 👏. Hoạt động ổn định hơn continue.dev (lần cuối dùng), việc còn lại là chọn mô hình xịn xịn tí 🤤

    » Xem thêm
  • Zed mới đây đã giới thiệu thêm tính năng Agent - tương tự như Agent trong Cursor hay Write trong Windsurf và họ gọi nó là The Fastest AI Code Editor.

    Cũng nhanh thật đấy vì Zed viết bằng Rust. Cơ mà chiến lược của họ có vẻ thay đổi, tập trung vào AI thay vì phát triển kho tiện ích mở rộng vốn đang có rất ít, không thể cạnh tranh được với VSCode 🥶

    Zed: The Fastest AI Code Editor

    » Xem thêm
  • Ngay sau thông tin OpenAI đạt được thoả thuận mua lại Windsurf với giá 3 tỉ đô thì ngày hôm nay Cursor đã miễn phí 1 năm dùng bản Pro cho sinh viên. Chaaaaà 🤔

    OpenAI Reaches Agreement to Buy Startup Windsurf for $3 Billion

    Cursor for Students | Cursor - The AI Code Editor

    » 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

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên 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