
TypeScript vs JavaScript khi AI viết code: 6 run, 1 bug
Thí nghiệm cho Claude Opus 5.5 viết Git clone 3 lần mỗi ngôn ngữ: TypeScript 0 bug, JavaScript 1 bug, chi phí chênh 7%. Khác biệt chưa đủ kết luận.
Thí nghiệm 6 lần cho Claude Opus 5.5 viết cùng một Git clone: TypeScript để lại 0 bug, JavaScript 1 bug. Chính tác giả nói con số đó không phân biệt được với may rủi.
Câu "để AI viết code thì TypeScript an toàn hơn" được lặp lại nhiều đến mức ít ai kiểm chứng. Một developer đã dựng thí nghiệm có kiểm soát ở quy mô vài nghìn dòng để đo.
Thiết kế thí nghiệm
AI được giao viết tgit — CLI tương thích Git, output phải khớp Git gốc từng ký tự. Tác giả chọn Git vì đáp án là tuyệt đối: chạy cùng thao tác trên Git thật rồi so sánh là chấm được bằng máy.
Spec giao ba đợt, cộng dồn 82 → 117 → 151 hidden test, cộng 2.000 chuỗi thao tác ngẫu nhiên mỗi version — so cả exit code, output, nội dung .git và xem git fsck --strict có chấp nhận repository không.
Điều kiện chỉ khác đúng ngôn ngữ: TS bật strict và noUncheckedIndexedAccess, cấm any, pass tsc mới tính xong; JS không type check. AGENTS.md giống nhau từng chữ trừ vài dòng đó. AI là Claude Opus 5.5 trong Claude Code, context giới hạn 200K.
Kết quả: gần như không phân biệt được
Năm trên sáu run đạt điểm tuyệt đối ở hidden test. Run rớt duy nhất là BN03 (JavaScript): 81/82, 116/117, 150/151.
Bug duy nhất sống sót: khi add file bị .gitignore loại, Git thật báo lỗi và không ghi gì; BN03 trả đúng exit code nhưng đã kịp ghi một .git/index rỗng trước khi fail. Tác giả nói thẳng đây không phải loại bug type checker bắt được — nó là chuyện thứ tự, viết y hệt trong TypeScript vẫn được.
Chi phí: TS đắt hơn 7%, lý do nằm ở cache
Chi phí ước tính 49,9 USD cho TypeScript và 46,7 USD cho JavaScript. Nghịch lý: JS sinh nhiều output token hơn (1,02M so với 1,00M) nhưng vẫn rẻ hơn.
Vì phần lớn tiền nằm ở input — output chỉ chiếm khoảng một phần ba chi phí. Cache read của TS cao hơn khoảng 9,3M token, riêng khoản đó đã khoảng 3 USD: agent đọc lại toàn bộ hội thoại từ cache mỗi lượt, mà code TS dài hơn khoảng 20% (4.985 dòng so với 4.153) nên mỗi lần đọc/ghi file lại nhét thêm vào hội thoại. Tổng token 67,7M so với 58,2M (TS +16%), nhưng khoảng dao động ba run hai bên vẫn chồng lên nhau.
JS chạy test gấp đôi
Nhánh TS chạy tsc 40–55 lần mỗi run nhưng chỉ 2–3 lần thực sự báo lỗi; cả ba run cộng lại AI chỉ gặp 8 lỗi type, một nửa thuộc loại "tên không tồn tại" — chạy một lần là lộ.
Ngược lại JS chạy npm test 28–36 lần mỗi run so với 13–19 lần của TS — chỉ số duy nhất mà khoảng dao động hai bên không chồng lên nhau. Đem code JS cuối soi lại bằng checkJs thì ra 832–1.022 lỗi type mỗi run, trung bình 925 — thủng lỗ chỗ dưới lăng kính type, nhưng điểm test vẫn gần tuyệt đối.
Đọc kết quả này thế nào
Giải thích của tác giả: AI tự kiểm chứng được với Git thật, trung bình hơn 120 kịch bản so sánh mỗi run, nên lỗi type checker lẽ ra bắt thì test đã bắt trước.
Đó cũng là giới hạn khi áp vào dự án của bạn: thí nghiệm có oracle hoàn hảo để đối chiếu, đa số dự án thật thì không — mất oracle thì nguồn tín hiệu JS dùng thay type checker cũng yếu đi. Với ba run mỗi bên, hãy coi đây là bằng chứng chống lại niềm tin "TS chắc chắn an toàn hơn cho AI", không phải cho chiều ngược lại.
Đáng theo dõi là giả thuyết tác giả bỏ ngỏ: dynamic typing có thể đuối dần khi codebase lớn lên, vì cách duy nhất để biết một thay đổi lan tới đâu là chạy test. Ở vài nghìn dòng, chạy test gấp đôi chưa tốn thêm token đáng kể — lớn hơn thì chưa ai đo.
Không spam, hủy đăng ký bất kỳ lúc nào.
Bài viết liên quan

Review code agent viết: xếp hàng rủi ro, bắt giải trình
07 thg 11, 2026
Audit AGENTS.md trong 5 phút: 62% file dính rule thừa
06 thg 11, 2026