JSON sang TypeScript

Dán một mẫu JSON và công cụ sẽ suy ra các interface TypeScript khớp với cấu trúc của nó. Kiểu của các trường được xác định theo giá trị quan sát được (string, number, boolean, Array<T>); các đối tượng lồng nhau nhận interface có tên riêng; còn những trường được quan sát là null hoặc thiếu sẽ trở thành tùy chọn (?) hoặc cho phép null (| null) tùy theo phong cách bạn chọn.

Cách chuyển JSON sang TypeScript

  1. 1

    Dán JSON

    Một mẫu là đủ, nhưng nhiều mẫu sẽ cải thiện việc suy luận khả năng null và kiểu hợp (union).

  2. 2

    Chọn phong cách đầu ra

    `interface` (mặc định), bí danh `type`, hoặc interface chỉ đọc với mọi trường được đánh dấu `readonly`.

  3. 3

    Chọn chiến lược tùy chọn

    Đánh dấu trường là `?` (có thể vắng mặt) hoặc `| null` (luôn hiện diện, nhưng có thể là null).

  4. 4

    Sao chép các kiểu

    Dán vào tệp `.ts` là bạn đã có quyền truy cập được định kiểu chặt chẽ vào phản hồi API.

Ví dụ

Đầu vào:

{ "id": 1, "name": "Alice", "age": null, "tags": ["admin", "user"], "address": { "city": "Madrid" } }

Đầu ra:

interface User {
  id: number;
  name: string;
  age: number | null;
  tags: string[];
  address: Address;
}

interface Address {
  city: string;
}

Ánh xạ kiểu

JSON TypeScript
chuỗi string
số nguyên / số thập phân number
giá trị boolean boolean
chỉ null null
null + T T | null (hoặc T?)
mảng của T T[]
mảng hỗn hợp (T1 | T2)[]
đối tượng Interface lồng nhau có tên
mảng rỗng unknown[] (không thể suy luận)

Trường tùy chọn so với trường cho phép null

  • foo?: string, trường này có thể vắng mặt khỏi đối tượng. Cần kiểm tra undefined.
  • foo: string | null, trường này luôn hiện diện nhưng có thể được đặt null một cách tường minh.
  • foo?: string | null, có thể vắng mặt HOẶC là null.

Bản thân JSON không có undefined, nhưng các API báo hiệu sự vắng mặt của trường theo những cách khác nhau. Hãy khớp với ngữ nghĩa của API bạn dùng.

  • Các API REST thường bỏ qua trường bị thiếu -> ?:.
  • GraphQL luôn trả về mọi trường được yêu cầu -> | null.
  • Một số SDK dùng cả hai cách trong các ngữ cảnh khác nhau.

Kiểu hợp so với kiểu literal

Nếu công cụ thấy cùng một trường chuỗi chỉ nhận một tập nhỏ giá trị qua các mẫu ("status": "pending", "active", "archived"), nó có thể tạo ra một kiểu hợp của các literal chuỗi:

status: "pending" | "active" | "archived";

Bật “suy luận kiểu hợp của literal chuỗi” nếu bạn muốn điều này.

Lỗi thường gặp

  • Suy luận từ một mẫu duy nhất. Mọi trường đều trở thành bắt buộc; không thể quan sát khả năng null. Để có kiểu tốt hơn, hãy cung cấp 5-10 mẫu đa dạng.
  • Mảng rỗng. "tags": [] không cung cấp thông tin kiểu, trình tạo sẽ xuất ra unknown[]. Hãy cung cấp một mẫu có ít nhất một phần tử.
  • Mảng kiểu hỗn hợp. [1, "two", true] tạo ra (number | string | boolean)[]. Thường thì điều này có nghĩa là JSON nên được thiết kế lại thay vì định kiểu như hiện tại.
  • Khóa dạng chuỗi số. JSON {"1": "a", "2": "b"} vẫn là một đối tượng trong TypeScript (Record<string, string>), không phải mảng. Trình tạo xử lý đúng trường hợp này.

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

Hãy khớp với API của bạn. Các API REST loại bỏ trường null thì phù hợp với ?:. GraphQL, vốn luôn trả về mọi trường được chọn, thì phù hợp với | null. Khi phân vân, T | null với cú pháp bắt buộc sẽ chặt chẽ hơn và bắt được nhiều lỗi hơn tại thời điểm biên dịch.

Có, nếu bạn bật tính năng này và cung cấp nhiều mẫu. Một trường được quan sát có 2-5 giá trị chuỗi khác nhau qua các mẫu sẽ được xuất ra dưới dạng kiểu hợp literal. Vượt ngưỡng đó, nó quay về string.

Phần lớn trường hợp nên dùng interface, nó mở cho việc mở rộng và được TypeScript tối ưu tốt hơn. Bí danh type hữu ích cho union, intersection, tuple và kiểu ánh xạ (mapped type). Với kiểu suy ra từ JSON thì cả hai đều dùng được; hãy chọn theo quy ước của dự án.

Có. Mỗi đối tượng lồng nhau trở thành một interface riêng, với tên suy ra từ khóa (user.address -> Address). Với các cấu trúc rất sâu hoặc lặp lại nhiều, hãy cân nhắc dùng JSON Schema cùng một trình tạo schema-to-TS chuyên dụng.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác