Kiểu Dữ Liệu Template Literal Của TypeScript Cho Phép Suy Luận Protobuf Không Cần Tạo Code, Nhưng Với Giá Nào?

BigGo Editorial Team
Kiểu Dữ Liệu Template Literal Của TypeScript Cho Phép Suy Luận Protobuf Không Cần Tạo Code, Nhưng Với Giá Nào?

Cộng đồng lập trình viên đang bàn tán sôi nổi về một thư viện proof-of-concept mới có tên là protobuf-ts-types, thư viện này tận dụng kiểu template literal của TypeScript để suy luận các kiểu TypeScript từ định nghĩa Protocol Buffer (protobuf) mà không cần tạo code. Mặc dù ấn tượng về mặt kỹ thuật, phương pháp này đã gây ra cuộc tranh luận về những tác động thực tế khi đẩy hệ thống kiểu của TypeScript đến giới hạn của nó.

Hệ Thống Kiểu Của TypeScript Như Một Trình Phân Tích Cú Pháp

Thư viện này, được tạo ra bởi lập trình viên Nathan Leung, sử dụng kiểu template literal của TypeScript để phân tích cú pháp định nghĩa protobuf trực tiếp trong hệ thống kiểu. Phương pháp này loại bỏ nhu cầu các bước tạo code riêng biệt thường được yêu cầu khi làm việc với protobuf. Cách triển khai khá ngắn gọn, với một người bình luận nhận xét: Thực tế là mã nguồn nhỏ gọn đến vậy thật điên rồ. Tôi đã mong đợi một thư viện phân tích cú pháp phức tạp và rối rắm được triển khai bằng các kiểu dữ liệu.

Điều làm cho phương pháp này đặc biệt thú vị là cách nó thể hiện khả năng ngày càng phát triển của hệ thống kiểu TypeScript. Thư viện này về cơ bản triển khai một trình phân tích cú pháp hoàn toàn trong hệ thống kiểu của TypeScript, cho thấy cách sử dụng kiểu template literal cho việc thao tác chuỗi phức tạp ở cấp độ kiểu.

Những Lo Ngại Về Hiệu Suất và Ứng Dụng Thực Tế

Mặc dù đạt được thành tựu kỹ thuật, nhiều lập trình viên bày tỏ lo ngại về các ứng dụng thực tế của phương pháp như vậy. Vấn đề chính được nêu ra trong các cuộc thảo luận là tác động đến thời gian biên dịch và trải nghiệm của lập trình viên.

Thật tuyệt vời khi thấy kiểu template literal linh hoạt đến vậy, nhưng tôi không thể tưởng tượng việc muốn những trò hề kiểu này xuất hiện trong ứng dụng sản phẩm và làm chậm thời gian biên dịch.

Quan điểm này được nhiều người bình luận khác đồng tình, họ lo ngại về khả năng phản hồi của IDE và hiệu suất xây dựng khi sử dụng các hoạt động phức tạp ở cấp độ kiểu trong các dự án thực tế. Mặc dù các ví dụ đơn giản có thể hoạt động tốt, nhiều lập trình viên lưu ý rằng trong các codebase lớn hơn, phương pháp này có thể làm giảm đáng kể trải nghiệm phát triển.

Hạn Chế và Các Phương Pháp Thay Thế

Thư viện này có một số hạn chế đáng chú ý. Hiện tại nó không hỗ trợ services, RPCs, trường oneof, trường map, hoặc imports từ các tệp proto khác. Ngoài ra, nó yêu cầu các chuỗi proto nội tuyến trong mã TypeScript, điều này tạo ra thách thức cho việc duy trì định nghĩa proto trên nhiều ngôn ngữ.

Nhiều lập trình viên trong cuộc thảo luận đề xuất rằng các phương pháp tạo code truyền thống có thể vẫn được ưa chuộng hơn cho việc sử dụng trong sản phẩm. Các công cụ tạo code tạo ra các kiểu TypeScript tĩnh dễ dàng hơn cho IDE xử lý và không yêu cầu tính toán phức tạp ở cấp độ kiểu trong quá trình phát triển.

Một số người bình luận cũng chỉ ra rằng đối với các dự án chỉ sử dụng TypeScript, việc định nghĩa kiểu trực tiếp trong TypeScript có thể đơn giản hơn việc sử dụng protobuf, với một người lưu ý rằng họ thích định nghĩa kiểu trong TypeScript và tạo proto từ đó, vì hệ thống kiểu của TypeScript mạnh mẽ hơn nhiều so với hệ thống Protobuf.

Những hạn chế chính của protobuf-ts-types

  • Không hỗ trợ servicerpc (chỉ hỗ trợ message)
  • Không hỗ trợ trường oneofmap
  • Không hỗ trợ import giữa các tệp proto
  • Yêu cầu chuỗi proto nội tuyến trong mã TypeScript
  • Có thể ảnh hưởng đến hiệu suất của IDE và thời gian biên dịch trong các dự án lớn
  • Chỉ là bản thử nghiệm, chưa sẵn sàng cho môi trường sản xuất

Sự Phát Triển Của Hệ Thống Kiểu TypeScript

Cuộc thảo luận xung quanh thư viện này nhấn mạnh một xu hướng rộng lớn hơn trong hệ sinh thái TypeScript: hệ thống kiểu ngày càng được sử dụng như một ngôn ngữ lập trình riêng biệt. Nhiều người bình luận đã so sánh với các hệ thống lập trình meta khác, với một người lưu ý rằng chúng ta đang dành tất cả nỗ lực này để biến hệ thống kiểu của một bộ tiền xử lý thành một ngôn ngữ meta hoàn chỉnh.

Sự phát triển này có cả người ủng hộ và người chỉ trích. Những người ủng hộ đánh giá cao tính linh hoạt và sức mạnh mà các tính năng kiểu nâng cao mang lại để mô tả các mẫu JavaScript phức tạp. Những người chỉ trích lo ngại rằng hệ thống kiểu đang trở nên quá phức tạp, dẫn đến thông báo lỗi khó hiểu và trải nghiệm lập trình viên kém.

Một cải tiến tiềm năng trong tương lai được đề cập là khả năng TypeScript hỗ trợ suy luận kiểu trong tagged template literals, điều này sẽ cho phép cú pháp thanh lịch hơn khi làm việc với các ngôn ngữ dành riêng cho miền được nhúng như định nghĩa protobuf.

Tóm lại, mặc dù protobuf-ts-types thể hiện một thành tựu kỹ thuật ấn tượng về khả năng của hệ thống kiểu TypeScript, cộng đồng vẫn còn chia rẽ về việc liệu các phương pháp như vậy có thực tế cho việc phát triển hàng ngày hay không. Dự án này đóng vai trò vừa là một proof-of-concept thú vị vừa là một chủ đề khởi đầu cho cuộc trò chuyện về hướng phát triển của TypeScript.

Tham khảo: protobuf-ts-types