javascript - Typescript ile diziye ekstra bir özellik nasıl eklenir


Bir diziye ekstra bir özellik eklemek istiyorum, ama bunu tanımlamakta sorun yaşıyorum.

küçük parça

const arr: string[] & {key: number} = ['123'];//ts error  Property 'key' is missing
arr.key = 10;

büyük kısmı

arr'yi önce indekse göre gruplamam, sonra değere göre sıralamam gerekiyor

Dizi özelliğine bir indeks eklemek, Object.values kullanıyorsam kolaylık sağlar ama Object.entries kullanıyorsam sağlamaz. Bunu yapmanın birçok yolu olduğunu biliyorum, ama sıradan js kullanıyorsam bunun çok daha kolay olduğunu düşünüyorum.

type Arr = {index: number, value: number};
const arr:Arr[] = []
arr.push({
    index: 10,
    value: 2
})
arr.push({
    index: 10,
    value: 1
})
arr.push({
    index: 10,
    value: 3
});
arr.push({
    index: 20,
    value: 100
});
arr.push({
    index: 20,
    value: 50
});
arr.reduce<Record<string, Arr[] & {index: number}>>((prev, curr) => {
    if(!prev[curr.index]){
        prev[curr.index] = [];//ts error Property missing
        prev[curr.index].index = curr.index;
    }
    prev[curr.index].push(curr);
    prev[curr.index].sort((a,b) => a.value - b.value);//or some insertion sort algorithm.
    return prev;
},{})

Cevap #1

Bir dizi literal kendiliğinden kesişimi karşılayamaz, bunu yapmanın en basit yolu, argümanlarının kesişimini döndüren Object.assign kullanmaktır:

const arr: string[] & {key: number} = Object.assign(['123'], {
    key: 10
});

Ve daha büyük örneğinizde de aynı şey kullanılabilir:

arr.reduce<Record<string, Arr[] & {index: number}>>((prev, curr) => {
    if(!prev[curr.index]){
        prev[curr.index] = Object.assign([], {
          index: curr.index
        })
    }
    prev[curr.index].push(curr);
    prev[curr.index].sort((a,b) => a.value - b.value);//or some insertion sort algorithm.
    return prev;
},{})

oyun alanı bağlantısı

Cevap #2

Lütfen onun yerine kabul edilen cevabı dikkate alın.

Küçük parça örneğinizde, string[] & {key: number} tip bildirimi asla karşılanamaz çünkü bir dizi string, key özelliğine sahip bir nesneyle aynı olamaz.

Büyük parça örneğinizle ilgili olarak, tam olarak neyi başarmaya çalışıyorsunuz? Eğer bir diziyi bir indekse göre gruplamak ve sonra değere göre sıralamak istediğinizi söylüyorsanız, indeksin birincil sıralama ölçütünüz ve değerin ikincil ölçütünüz olduğunu mu kastediyorsunuz? Bu durumda, her iki değeri de göz önünde bulunduran kendi sıralama fonksiyonunuzu yazacağınızı varsayarım. Bu Stackoverflow konusundan bir örnek bulacaksınız.

İlgili makaleler