Bir nesne dizisini nasıl tanımlayabilirim?


199

TypeScript'te bir nesne dizisi oluşturuyorum:

 userTestStatus xxxx = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
 };

Birisi bana tipini nasıl doğru beyan edebileceğimi söyleyebilir mi? Satır içi yapmak mümkün mü yoksa iki tanıma ihtiyacım var mı?

Ben xxxbir tür bildirimi ile değiştirmek için arıyorum , böylece TypeScript daha sonra userTestStatus[3].nammmeyanlışlıkla gibi bir şey kullanırsanız beni uyarır .

Yanıtlar:


283

Sayı benzeri özelliklere sahip bir nesne değişmezi yerine yerel bir dizi kullanmaktan daha iyi olursunuz, böylece numaralandırma (ve diğer birçok dizi işlevinin yanı sıra) kullanıma hazır hale gelir.

Burada aradığınız şey , diziniz için başlangıçta var olan veya daha sonra tanıtılan dizideki her öğeyi tanımlayan bir satır içi arabirim tanımıdır:

let userTestStatus: { id: number, name: string }[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

Dizinizi hemen değerlerle başlatırsanız, açık tür tanımı bir zorunluluk değildir; TypeScript, ilk atamadan çoğu öğe türünü otomatik olarak çıkarabilir:

let userTestStatus = [
    { "id": 0, "name": "Available" },
    ...
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

4
Ayrıca bir dizi nesneyi şu şekilde beyan edebilirsiniz:let someArray: Array<{ id: number, name: string }> = []
Alexander Kim

77

Yukarıda sahip olduğunuz şey bir dizi değil, bir nesnedir.

Bir dizi yapmak için [& ]öğelerini çevrelemek için kullanın .

userTestStatus = [
  { "id": 0, "name": "Available" },
  { "id": 1, "name": "Ready" },
  { "id": 2, "name": "Started" }
];

Bunun dışında TypeScript, JavaScript'in bir üst kümesidir, bu nedenle geçerli olan her ne olursa olsun JavaScript geçerli TypeScript olur, dolayısıyla başka bir değişiklik gerekmez.

OP'den geri bildirim açıklaması ... yayınlanan model için bir tanıma ihtiyaç var

Nesne modelinizi temsil etmek için burada tanımlanan türleri kullanabilirsiniz:

type MyType = {
    id: number;
    name: string;
}

type MyGroupType = {
    [key:string]: MyType;
}

var obj: MyGroupType = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
};
// or if you make it an array
var arr: MyType[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

Üzgünüm belki sorum açık değildi. Ne yapmak istedim userTestStatus için bir tanım bulmak oldu.

1
@Marilou Tanımı genellikle userTestStatusen sevdiğiniz IDE'deki değişkenin üzerine getirerek alabilirsiniz ... TypeScript oyun alanı gösterir { id: number, name: string; }[]. İsterseniz bir arayüz o sarabilirdiniz interface NameThis { id: number, name: string; }ve NameThis[]dizi türü olarak.
Fenton

Bunu denedim ama bana birkaç hata veriyor. Ancak istediğim gibi bir şey olduğunu düşünüyorum: userTestStatus: {id: number, name: string; } [] = {"0": {"id": 0, "name": "Available"}, "1": {"id": 1, "name": "Ready"},

Örnek tanımlamanızda var arr: MyType, özellik adı / dizin bildirimlerini "0": { … }; sadece bu noktada değişmez nesneyi kullanırsınız.
gfullam

@gfullam haklısın, cevabımı güncelledim (hızlı bir dikkatsiz düzenleme oldu)
Brocco

36

Bazı tslintkurallar [], örnek mesaj kullanımını devre dışı bırakıyor:Array type using 'T[]' is forbidden for non-simple types. Use 'Array<T>' instead.

Sonra şöyle yazarsınız:

var userTestStatus: Array<{ id: number, name: string }> = Array(
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
);

2
Şimdiye kadarki en pratik yaklaşım. basit dizi kullanım durumları için basit ve doğrudan bir çözümdür. +1 almak
Julio Vedovatto

18

Gerçekten istediğiniz şey bir numaralandırma olabilir

Bir numaralandırma gibi davranan bir şey arıyorsanız (bir nesne tanımladığınızı ve sıralı bir kimlik 0, 1, 2 eklediğinizi ve yanlış yazmak istemediğiniz bir ad alanı içerdiğini görüyorum (örneğin, ad vs naaame) , sıralı kimlik otomatik olarak halledildiğinden ve sizin için kutunun dışında bir tür doğrulama sağladığından bir numaralandırma tanımlamaktan daha iyidir.

enum TestStatus {
    Available,     // 0
    Ready,         // 1
    Started,       // 2
}

class Test {
    status: TestStatus
}

var test = new Test();
test.status = TestStatus.Available; // type and spelling is checked for you,
                                    // and the sequence ID is automatic

Yukarıdaki değerler otomatik olarak eşlenecektir, örneğin "Kullanılabilir" için "0" ve bunları kullanarak erişebilirsiniz TestStatus.Available. Ve Typcript, bunları ilettiğinizde türü zorlar.

Yeni bir türü özel türünüzün dizisi olarak tanımlamakta ısrar ediyorsanız

Bir nesne dizisi istediniz (tam olarak "0", "1" ve "2" tuşlarına sahip bir nesne değil), bu yüzden önce nesnenin türünü, sonra içeren bir dizinin türünü tanımlayalım.

class TestStatus {
    id: number
    name: string

    constructor(id, name){
        this.id = id;
        this.name = name;
    }
}

type Statuses = Array<TestStatus>;

var statuses: Statuses = [
    new TestStatus(0, "Available"),
    new TestStatus(1, "Ready"),
    new TestStatus(2, "Started")
]

Üzgünüm belki sorum açık değildi. Ne yapmak istediğim, typcript bana nerede kullanıldığını kontrol etmek için izin verecek ve böylece userTestStatus [1] .naaaame giremedim userTestStatus için bir tanım bulmak oldu.

Ben "userTestStatus" ve "=" arasında koymak için bir şey bulmak istedim. Aynı şekilde, değişkenin ne tür olduğunu söylemek için dize veya sayı koyabilirim. Brocco gibi bir şey yaptı ama mümkünse sadece bir satırla.

-1

Ayrıca deneyebilirsiniz

    interface IData{
        id: number;
        name:string;
    }

    let userTestStatus:Record<string,IData> = {
        "0": { "id": 0, "name": "Available" },
        "1": { "id": 1, "name": "Ready" },
        "2": { "id": 2, "name": "Started" }
    };

Kaydın nasıl çalıştığını kontrol etmek için: https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt

Burada bizim durumumuzda Kayıt, anahtarı bir dize olacak ve değeri IData türünde olacak bir nesneyi beyan etmek için kullanılır, bu yüzden şimdi mülküne erişmeye çalıştığımızda bize fikir vereceğiz ve denememiz durumunda tür hatası atacağız userTestStatus [0] .nameee gibi bir şey


bunun neden eldeki sorunu çözdüğü hakkında daha fazla bilgi vermelisiniz
Cornel Raiu
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.