JSON Sang TypeScript Interface
Công cụ online JSON sang TypeScript miễn phí. Dán JSON, lấy interface chuẩn với object lồng nhau, mảng và liên hợp chuỗi. Riêng tư, chạy ngay trên trình duyệt.
Về Công Cụ Tạo TypeScript Interface Từ JSON
Tạo TypeScript interface nghiêm ngặt, idiomatic từ bất kỳ mẫu JSON nào. Hữu ích khi bạn cần type API response, cấu hình tRPC input, validate localStorage data, hoặc migrate codebase JavaScript sang TypeScript mà không phải viết tay mọi shape.
Công cụ suy luận types từ giá trị, xử lý nested object, build named sub-interface, merge array-element shape, hỗ trợ nullable field, và cung cấp ba kiểu khai báo: strict types, nullable fallback, hoặc all-optional. Dán JSON, lấy code sạch để paste thẳng vào file .ts.
Tại sao tạo TypeScript interface từ JSON thay vì viết tay?
Ba lý do thực tế. Thứ nhất, độ chính xác khi thay đổi — khi API trả về response thực, interface tạo ra khớp với shape thực tế, bao gồm mọi field name, type, và nullable spot bạn có thể quên khi viết tay. Thứ hai, tốc độ — response API 200 field mất 30 phút type thủ công tạo trong một lần paste. Thứ ba, tính nhất quán giữa team — nhiều dev viết cùng interface từ doc API luôn bất đồng về optional field, casing, và nested shape; tạo từ response capture được cho một câu trả lời chuẩn duy nhất. Lưu ý: type tạo ra khóa vào dữ liệu mẫu bạn cung cấp, nên field chỉ có trên một số response sẽ được type là required khi nó nên optional. Luôn chạy công cụ trên nhiều response đại diện (success path, empty path, error path) và merge type kết quả.
Công cụ xử lý nested object, array of object, và mixed-type array như thế nào?
Nested object trở thành interface riêng có tên, dẫn xuất từ field name (camelCase hoặc snake_case thành PascalCase: address → Address, user_profile → UserProfile). Nếu tên va chạm với interface hiện có có shape khác, công cụ thêm số (Address, Address2, Address3) để giữ type riêng biệt. Array of primitive thành T[] trong đó T là element type suy luận — string[], number[], boolean[]. Array of object thành Item[] trong đó Item là interface tạo ra merge tất cả field qua các phần tử array; field có trong một số nhưng không tất cả phần tử nên đánh dấu optional. Mixed-type array — ví dụ [1, "two", true] — thành union type: (string | number | boolean)[]. Array rỗng mặc định unknown[].
Khác biệt giữa interface và type alias, nên dùng cái nào?
Tương tự về chức năng cho object shape, nhưng có khác biệt chính. Interface hỗ trợ declaration merging — khai báo interface User { name: string } hai lần và TypeScript merge chúng thành một interface với cả hai field. Điều này hữu ích để mở rộng third-party type (mở rộng Express Request để thêm user property sau middleware auth). Type alias không hỗ trợ merging — khai báo lại là lỗi. Interface có thể mở rộng qua cú pháp extends; type kết hợp qua intersection (&) và union (|). Type alias có thể alias non-object type (type ID = string | number) và primitive union. Hiệu suất: giống hệt cho object type trong TypeScript hiện đại. Quy ước 2026: hầu hết team thích interface cho public API contract (mở rộng được, merge được) và type cho utility type, union, và computed type.
Xử lý field đôi khi null đôi khi giá trị trong API thực tế như thế nào?
API thực tế trả về null cho field chưa có giá trị (lastLogin: null khi user chưa đăng nhập). Strict mode TypeScript yêu cầu bạn xử lý điều này một cách tường minh. Ba pattern công cụ cung cấp: (1) Strict types — nếu giá trị mẫu là null, type trở thành null đúng nghĩa đen. Điều này sai cho field đôi khi được populated. (2) Mark null as nullable — null field thành T | null trong đó T là unknown, để bạn có thể refine type sau. (3) All Fields Optional — mọi field thành optional, quá lỏng cho field API đảm bảo. Best practice production: tạo từ response nơi field có giá trị thực, sau đó chỉnh tay type thành T | null nơi bạn biết field đôi khi null. Để tự động hóa tốt hơn, tích hợp công cụ schema-first như tRPC, Zod, hoặc OpenAPI types.
Có thể tạo type trực tiếp từ API response hay phải paste JSON mỗi lần?
Công cụ này yêu cầu bạn dán JSON thủ công — chạy hoàn toàn trên browser không có truy cập mạng, nên không thể fetch từ API của bạn. Workflow dự kiến: dùng browser DevTools hoặc công cụ như Postman / Insomnia / Hoppscotch để capture API response thực, copy JSON body, dán vào công cụ này, copy TypeScript output, dán vào codebase. Để tạo tự động từ endpoint trực tiếp, dùng công cụ server-side: quicktype (CLI), json-to-ts npm package cho tạo programmatic, hoặc công cụ schema-first như OpenAPI Generator pull từ spec file. Cho ứng dụng TypeScript full-stack, tRPC loại bỏ round-trip hoàn toàn — type chảy từ server router đến client mà không cần JSON-to-type conversion.

Xử lý TypeScript type cho API thay đổi theo thời gian hoặc có schema phiên bản như thế nào?
Type tạo ra capture một thời điểm, nhưng API tiến hóa — field được thêm, deprecated, đổi tên, và xóa. Ba chiến lược giữ type hiện hành: (1) Tạo lại thủ công khi schema thay đổi — khi thay đổi API được tài liệu hóa, chạy lại generator với response mới và diff output với type hiện tại; hữu ích cho thay đổi tần số thấp. (2) Schema-driven type — nếu API cung cấp OpenAPI, GraphQL, hoặc Protobuf schema, tạo type từ schema thay vì response; công cụ như openapi-typescript, graphql-codegen, và ts-proto xử lý phiên bản. (3) Runtime validation — kết hợp static type với runtime schema validator (Zod, Valibot, ArkType) để type mismatch tại runtime trở thành lỗi tường minh thay vì hỏng âm thầm; đặc biệt giá trị cho third-party API.
Có gì sai với việc dùng any để type API response — tại sao bận tâm strict interface?
Type API response là any là shortcut phổ biến nhất và nguồn bug production phổ biến nhất trong codebase TypeScript. Với any, compiler chấp nhận user.adddress (lỗi chính tả), user.id.toUppercase (id là number, không phải string), và array[1000].name (có thể undefined) — tất cả crash tại runtime, không cái nào bị bắt tại build time. Strict interface chuyển những cái này thành lỗi compile-time chặn code xấu khỏi ship. Đánh đổi là công sức ban đầu: viết hoặc tạo type mất vài phút any tiết kiệm. Lợi ích tăng theo kích thước team và codebase — cho prototype solo, any ổn; cho codebase chia sẻ trên 1000 dòng, strict type bắt 60-80% bug. Practice hiện đại 2026: không bao giờ dùng any cho biên external data; dùng unknown cộng runtime validation nếu shape thực sự động; dùng interface tạo ra cho API đã biết.
Công cụ có suy luận liên hợp literal chuỗi (enum) không và dùng readonly hay as const thế nào?
Có. Bật tùy chọn Liên hợp chuỗi (Phát hiện liên hợp chuỗi) và bộ tạo sẽ kiểm tra các field qua tất cả phần tử của một mảng object; khi giá trị của một field tạo thành tập hợp nhỏ, đếm được đầy đủ các chuỗi riêng biệt, nó phát ra một liên hợp literal thay vì kiểu string lỏng lẻo — ví dụ role: 'admin' | 'user' thay vì role: string. Đây chính là sự bảo vệ mà TypeScript nghiêm ngặt tồn tại để cung cấp: với kiểu string thuần, lỗi gõ như status === 'activ' vẫn biên dịch tốt và lọt vào production, trong khi liên hợp 'active' | 'inactive' biến nó thành lỗi biên dịch. Điều khiển Số giá trị riêng biệt tối đa (mặc định 12, giới hạn 2-50) đặt ngưỡng cắt — field có nhiều giá trị riêng biệt hơn giới hạn sẽ quay về string, vì field có độ phân tán cao như id hay tên không phải enum thật. Suy luận chỉ chạy trên mảng object, vì một object đơn lẻ chỉ cho một mẫu và một giá trị không bao giờ đếm hết được. Sau khi tạo, bạn có hai cách idiomatic để thắt chặt thêm: thêm bổ ngữ readonly (readonly role: 'admin' | 'user') để field không thể gán lại sau khi khởi tạo, hữu ích cho DTO API response cần xem là bất biến; hoặc, với object cấu hình hằng số thay vì kiểu, thêm as const vào giá trị literal (const ROLES = ['admin', 'user'] as const) rồi suy ra liên hợp bằng typeof ROLES[number]. Để an toàn runtime ngoài thời điểm biên dịch, ghép liên hợp với validator như z.enum(['admin', 'user']) của Zod nhằm bắt giá trị bất ngờ tại ranh giới.
Công cụ xử lý JSON rất lớn, số nguyên lớn và chuỗi ngày tháng thế nào?
Quá trình chuyển đổi chạy hoàn toàn trên trình duyệt trong một lần dán, nên hiệu năng tỷ lệ với JSON.parse và render DOM — các API response điển hình (hàng chục nghìn dòng) chuyển ngay tức thì, nhưng payload nhiều megabyte có thể chậm vì phải duyệt toàn bộ cấu trúc để suy luận kiểu; với chúng, hãy cắt xuống tập con đại diện hoặc dùng CLI như quicktype. Về độ chính xác số: JSON chỉ có một kiểu number và JavaScript parse mọi giá trị số thành float 64-bit, nên số nguyên vượt Number.MAX_SAFE_INTEGER (2^53 - 1) mất chính xác âm thầm trước khi công cụ thấy — kiểu tạo ra là number, nhưng nếu API trả về id 64-bit, server nên gửi dưới dạng chuỗi và bạn nên gán kiểu string, hoặc dùng kiểu bigint với parser giữ được nó. Field ngày và timestamp vẫn được gán kiểu string vì giá trị ISO-8601 như 2026-05-29T00:00:00Z là chuỗi JSON, không phải object Date; điều đó đúng cho định dạng truyền tải. Chuyển sang Date tại ranh giới (new Date(dto.createdAt)) và giữ kiểu DTO là string, hoặc dùng branded type / z.string().datetime() của Zod để phân biệt chuỗi ngày với văn bản thường mà không nói dối về thứ đi qua mạng.
Công cụ này so sánh với quicktype, json-to-ts, và công cụ JSON-to-TypeScript khác thế nào?
quicktype là công cụ open-source được trích dẫn nhiều nhất với phân tích sâu nhất: nó walk nhiều mẫu JSON để suy luận optional field, union type từ response khác nhau, và shape polymorphic phức tạp. Nó là CLI với web playground, hỗ trợ 20+ ngôn ngữ output, và là lựa chọn đúng cho tạo type production từ dataset lớn hoặc đa dạng. json-to-ts là npm package nhỏ hơn chỉ tập trung vào TypeScript output, đơn giản hơn nhưng kém suy luận. Công cụ online như JSON-Type, Transform.tools, và cái này tiện cho conversion một lần không cần setup CLI. Thiết kế công cụ này ưu tiên sử dụng browser nhanh: dán, thấy output ngay, copy clipboard, không gọi mạng external — hữu ích khi bạn cần draft đầu tiên nhanh cho một response duy nhất. Cho workflow team tạo type từ nhiều file mẫu, chuyển sang quicktype.
