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é!
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é.
Đề 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.
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 2020 và 2021 thì nó luôn nằm trong top đầu về điều mà các nhà phát triển muốn nhất.
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.
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.
Bí mật ngăn xếp của Blog
Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!
Đăng ký nhận thông báo bài viết mới
Bình luận (1)