Typescript: İç içe nesneler için arayüzleri nasıl tanımlarım?


94

Aşağıdaki gibi bir şeye ayrıştıran bir JSON yüküm olduğunu varsayalım:

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

Öğeler özelliğinin değerinin anahtarları dizeler olan ve değerleri Öğe arabirimi tarafından tanımlanan bir nesne olduğunu modellemek için Örnek arabirim tanımını nasıl ayarlayabilirim:

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

}

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

Yanıtlar:


162

Typescript, sözdizimini kullanarak nesne anahtarları için bir tür eklemenize izin verir [key: string].

Belgelerde belirtildiği gibi, bunlar dizine eklenebilir türler olarak adlandırılır :

İndekslenebilir türler, indeksleme sırasında karşılık gelen dönüş türleriyle birlikte nesneye indekslemek için kullanabileceğimiz türleri açıklayan bir indeks imzasına sahiptir.

Sizin durumunuzda, aşağıdakileri kullanırsınız:

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

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

Referans için, burada canlı bir örneğe bir bağlantı var .


2
Neden Itemarayüzü dışa aktarıyorsunuz? Sadece Examplearayüzü dışa aktarmak yeterli değil mi?
Alexander Kim

2
@AlexanderKim evet, Itembu türleri kullanan diğer kodlar için yararlı olmadığı sürece .
evanrmurphy

Öğe anahtarlarını durum ile nasıl ayarlayacağını ve bunlara nasıl erişeceğini bilen var mı?
Köpek

@Dog elbette ama bu bir "kod benim için" web sitesi değil
Emobe

Bunun için teşekkürler, başka bir sınıftaki bir sınıf dosyasında tanımlanan bir arayüze erişirken sorun yaşadım. Arayüzü dışa aktarım ile tanımlamadım. Dışa aktarımı ekledikten sonra, sayfanın önündeki içe aktarma, daha sonra sınıfı ve arayüzü içeri aktarmama izin verdi teşekkürler.
Gurnard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.