5 điểm bởi asheswook 2025-12-24 | 2 bình luận | Chia sẻ qua WhatsApp

Xin chào.

Thông thường khi phát triển backend TypeScript, điểm dễ phát sinh lỗi nhất chính là phần runtime không thể được bắt ở thời điểm biên dịch.

Ví dụ, lỗi thường xuất hiện nhiều nhất ở phần triển khai repository để parse DB row hoặc phần giao tiếp với API bên ngoài.

Đó là những trường hợp giá trị nhận từ DB khác với kỳ vọng nên bị gán thành undefined ở runtime, hoặc khi ép kiểu thì không xác định đúng giá trị nguyên thủy từ bên ngoài đưa vào, dẫn đến lỗi do con người.

Ngay cả khi triển khai repository, cũng phải chèn thêm đủ loại kiểu bằng interface cho các giá trị nguyên thủy đi từ bên ngoài vào. Có thể đây chỉ là vấn đề nhỏ, nhưng tôi đã tạo ra nó để dùng thuận tiện hơn.

Trên thực tế, mã cho phần API bên ngoài và phần triển khai DB đã gọn hơn nhiều, đồng thời các lỗi phát sinh ở runtime cũng giảm đi.

Sau khi thử dùng cho backend trong team và thấy khá ổn, tôi đã phát hành nó lên npm.

import { validate } from 'valdex';  
  
const data: unknown = await fetchData();  
  
validate(data, {  
  name: String,  
  age: Number,  
  active: Boolean  
});  
  
// TypeScript now knows the exact type of data  
data.name // string  
data.age // number  
data.active // boolean  

Ví dụ trên giả định tình huống lấy dữ liệu từ bên ngoài. Dù dùng axios, mysql2 hay postgres pg đều có thể áp dụng. Hệ thống sẽ kiểm chứng giá trị được đưa vào dưới kiểu unknown, và nếu hợp lệ thì trong luồng điều khiển phía sau, giá trị đó sẽ được xác nhận (asserts) thành kiểu đã định nghĩa trong validate().

Tất nhiên bạn cũng có thể dùng thư viện như zod.

Điểm khác nhau giữa zod và valdex là valdex không tạo schema dưới dạng instance để sử dụng, mà cho phép xử lý kiểu dữ liệu một cách khai báo ngay bên trong nơi nhận dữ liệu. Bạn không cần phải lên xuống sửa code chỉ để chỉnh interface hay sửa class DTO.

npm i valdex  

Bạn có thể cài từ npm và dùng thử.

Github: https://github.com/asheswook/valdex

2 bình luận

 
sunrabbit 2025-12-24

Có vẻ như nó sẽ mang lại DX cực kỳ tốt, ít nhất là với các kiểu đơn giản, ha.

 
asheswook 2025-12-24

Vì hỗ trợ cả Nested Object lẫn Array nên cho đến giờ khi triển khai API hoặc repository bên ngoài, tôi vẫn chưa thấy điểm nào gây vướng víu.
Cảm ơn bạn đã quan tâm!