Typoskript: Wie definiere ich Schnittstellen für verschachtelte Objekte?


88

Angenommen, ich habe eine JSON-Nutzlast, die in etwa Folgendes analysiert wird:

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

Wie würde ich die Definition der Beispielschnittstelle einrichten, um zu modellieren, dass der Wert der Eigenschaft items ein Objekt ist, dessen Schlüssel Zeichenfolgen sind und dessen Werte von der Item-Schnittstelle definiert werden:

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

}

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

Antworten:


146

Mit Typescript können Sie mithilfe der Syntax einen Typ für die Objektschlüssel hinzufügen [key: string].

Wie in der Dokumentation angegeben, werden diese als indexierbare Typen bezeichnet :

Indexierbare Typen haben eine Indexsignatur, die die Typen beschreibt, die zum Indizieren in das Objekt verwendet werden können, sowie die entsprechenden Rückgabetypen bei der Indizierung.

In Ihrem Fall würden Sie Folgendes verwenden:

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

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

Als Referenz finden Sie hier einen Link zu einem Live-Beispiel .


2
Warum exportieren Sie ItemSchnittstelle? ExampleReicht es nicht aus, nur die Schnittstelle zu exportieren ?
— Alexander Kim

2
@AlexanderKim ja, es Itemsei denn, dies ist auch für anderen Code nützlich, der diese Typen verwendet.
— Evanrmurphy

Weiß jemand, wie man die Elementschlüssel mit Status festlegt und darauf zugreift?
— Hund

@ Hund natürlich, aber dies ist keine "Code für mich" Website
— Emobe

Vielen Dank dafür. Ich hatte ein Problem beim Zugriff auf eine Schnittstelle, die in einer Klassendatei in einer anderen Klasse definiert ist. Ich hatte die Schnittstelle mit Export nicht definiert. Nachdem ich den Export hinzugefügt hatte, erlaubte mir der Import am bis der Seite, die Klasse und die Schnittstelle zu importieren, danke.
— Gurnard
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.