Typecript: Làm cách nào để xác định giao diện cho các đối tượng lồng nhau?


93

Giả sử tôi có một tải trọng JSON phân tích cú pháp thành một thứ như thế này:

{
    name: "test",
    items: {
        "a": {
            id: 1,
            size: 10
        },
        "b": {
            id: 2,
            size: 34
        }
    }
}

Làm cách nào để thiết lập định nghĩa của giao diện Ví dụ để mô hình hóa rằng giá trị của thuộc tính items là một đối tượng có khóa là chuỗi và có giá trị được xác định bởi giao diện Item:

export interface Example {
    name: string;
    items: ???;

}

export interface Item {
    id: number;
    size: number;
}

Câu trả lời:


160

Typecript cho phép bạn thêm một kiểu cho các khóa đối tượng bằng cú pháp [key: string].

Như đã nêu trong tài liệu, chúng được gọi là các loại có thể lập chỉ mục :

Các kiểu có thể lập chỉ mục có chữ ký chỉ mục mô tả các kiểu mà chúng ta có thể sử dụng để lập chỉ mục vào đối tượng, cùng với các kiểu trả về tương ứng khi lập chỉ mục.

Trong trường hợp của bạn, bạn sẽ sử dụng như sau:

export interface Item {
    id: number;
    size: number;
}

export interface Example {
    name: string;
    items: {
        [key: string]: Item
    };
}

Để tham khảo, đây là một liên kết đến một ví dụ trực tiếp .


2
Tại sao bạn xuất Itemgiao diện? Không chỉ xuất Examplegiao diện là đủ?
— Alexander Kim

2
@AlexanderKim có, trừ khi Itemcũng hữu ích cho các mã khác sử dụng các loại này.
— evanrmurphy

có ai biết cách đặt các phím mục với trạng thái và truy cập chúng không?
— Dog

@Dog tất nhiên nhưng đây không phải là trang web "mã dành cho tôi"
— Emobe

Cảm ơn vì điều này, tôi đã gặp sự cố khi truy cập giao diện được xác định trong một tệp lớp trong lớp khác. Tôi đã không xác định giao diện với xuất khẩu. Sau khi thêm xuất nhập khẩu ở đầu trang cho phép tôi sau đó nhập lớp và giao diện cảm ơn.
— Gurnard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.