Tạo kiểu TypeScript từ JSON

Mẫu JSON sang interface TypeScript, Zod, JSON Schema, struct Go hoặc Python.

Các tùy chọn này dành cho TypeScript.

Đầu ra

4 kiểu có tên · 28 dòng

Công cụ này làm gì

Dán một mẫu JSON, chẳng hạn phản hồi API chép từ tab Network của trình duyệt, và đọc các kiểu mà nó ngụ ý. Cùng một hình dạng được suy ra sẽ được viết theo năm cách: interface hoặc type TypeScript, schema Zod kèm z.infer, JSON Schema (bản 2020-12), struct Go có thẻ json, và dataclass Python. Không có gì được tải lên; JSON được phân tích ngay trong trình duyệt bằng bộ phân tích chặt chẽ của công cụ định dạng JSON, nên lỗi cú pháp được báo kèm dòng và cột.

Kiểu được suy ra thế nào

  • Đối tượng thành kiểu có tên lấy từ khóa (customer → Customer, shipping-address → ShippingAddress); phần tử của mảng được đặt tên số ít (items → Item, categories → Category).
  • Các phần tử mảng được gộp thành một kiểu. Nếu dòng hàng đầu tiên không có gift_note mà dòng thứ hai có, trường đó thành tùy chọn: gift_note?: string. Các loại khác nhau thành union: [1, "a", null] là (string | number | null)[].
  • null được giữ trong kiểu. Trường lúc null lúc là chuỗi sẽ là string | null. Trường chỉ toàn null có kiểu null, vì mẫu không cho biết gì hơn.
  • Mảng rỗng là unknown[]; đối tượng rỗng là Record<string, unknown> chứ không phải {}, vì trong TypeScript {} nghĩa là "mọi giá trị trừ null".
  • Số nguyên và số thập phân đều là number trong TypeScript, nhưng được phân biệt ở nơi ngôn ngữ cần: int64/float64 trong Go, int/float trong Python, integer/number trong JSON Schema, .int() trong Zod.
  • Khóa không phải định danh (first-name, 2fa) được đặt trong nháy kép; trong Go và Python chúng có tên trường hợp lệ, khóa gốc nằm trong thẻ hoặc chú thích.

Khi tên bị trùng

Hai đối tượng có đúng cùng các trường sẽ dùng chung một kiểu. Hai đối tượng khác nhau cùng muốn một tên thì được đánh số: User và User2, bạn nên đổi tên cái thứ hai cho có nghĩa. Tên trùng kiểu có sẵn được thêm hậu tố: khóa date cho ra DateType, vì interface Date sẽ âm thầm gộp với Date của JavaScript.

Giới hạn cần biết

Một mẫu chỉ cho thấy một phản hồi, không phải mọi thứ API có thể gửi. Trường trạng thái là string chứ không phải union các giá trị hợp lệ; ngày tháng là chuỗi. Hãy dán nhiều bản ghi trong một mảng để gộp, rồi chỉnh tay cho chặt hơn. Với dữ liệu đến từ mạng, schema Zod còn kiểm tra lúc chạy. Bài viết tạo kiểu TypeScript từ JSON của API đi qua một ví dụ đầy đủ và giải thích vì sao any vẫn len lỏi quay lại.

Câu hỏi thường gặp

Vì sao một trường có kiểu null thay vì string | null?

Vì trong mọi mẫu bạn dán, trường đó đều là null, nên không có gì cho biết kiểu thật của nó. Hãy dán thêm một bản ghi có giá trị, trong cùng một mảng, hai mẫu sẽ được gộp thành string | null.

Nên dùng kiểu TypeScript hay schema Zod?

Kiểu biến mất khi biên dịch nên không bắt được API gửi dữ liệu khác. Schema Zod kiểm tra dữ liệu khi nó đến và vẫn cho cùng các kiểu qua z.infer. Dùng kiểu cho dữ liệu bạn kiểm soát, dùng schema ở ranh giới hệ thống.

JSON của tôi có bị tải lên đâu không?

Không. Việc phân tích và sinh mã đều chạy trong trình duyệt. Dù vậy, vẫn nên xóa token và dữ liệu cá nhân trước khi dán.

Vì sao khóa date thành DateType?

Một interface tên Date sẽ gộp với kiểu Date có sẵn và thay đổi nó trong toàn bộ chương trình. Các tên có sẵn như Date, String, Map, Record được thêm hậu tố Type để tránh việc đó.