javascript - '__0' ve 'value' parametre türleri uyumsuz - Typescript


Ben bir TypeScript uzmanı değilim ve aşağıdaki hatayı çözmeye çalışırken takıldım:

‘({ keys, fire }: { keys?: any; fire: any; }) => void’ türündeki argüman, ‘(value: unknown, value2: unknown, set: Set) => void’ türündeki parametreye atanamaz. ‘__0’ ve ‘value’ parametrelerinin türleri uyumsuzdur. ‘unknown’ türü ‘{ keys?: any; fire: any; }’ türüne atanamaz.

Kod bloğu şudur:

listeners.forEach(({ keys, fire }: {keys?: any; fire: any}) => {
  //some code
});

Listeners şöyle bir settir:

const listeners = new Set();

ve ben bir nesneyi buna şöyle itiyorum:

const create = (keys) => {
  //keys can be undefined
  const listener = {
    keys,
    fire: useState()[1],
  };
  listeners.add(listener)
}

Eğer forEach'ten ateşi veya anahtarları kaldırırsam bile aynı hatayı alıyorum ve bunun neden olduğunu çözemedim.

Cevap #1

TypeScript'teki Set tip tanımlamaları, onu Set<T> olarak tanımlar; bu, kümenin elemanlarına karşılık gelen generik bir tür parametresine sahip bir arayüzdür. Set() yapıcısını herhangi bir tür bilgisi sağlamadan çağırırsanız, TypeScript derleyicisi bu tür parametresini tahmin etmeye çalışacaktır.

Örneğin, bir Set oluşturup bunu bir dizi ile başlatırsanız, derleyici tipi parametreyi çıkarmak için dizi elemanlarını kullanacaktır:

const setOfStuff = new Set([{ a: 1, b: 2 }, { a: 3, b: 4 }]);
/* const setOfStuff: Set<{
    a: number;
    b: number;
}> */

Ama eğer yapıcıyı hiçbir argüman vermeden çağırırsanız, derleyicinin küme elemanlarının türünü çıkarabileceği bir şey olmaz ve bu yüzden varsayılan olarak unknown türüne geri döner:

const oops = new Set(); 
// const oops: Set<unknown>

unknown türü herhangi bir değeri kabul edebilir, bu yüzden unknown türünde bir değer vermek çok kolaydır. Ancak diğer taraftan, bir unknown değeri her şey olabileceğinden, böyle bir değeri tüketmek çok zordur. Derleyici, kümenizin elemanlarını { keys?: any; fire: any; } türündeymiş gibi muamele ettiğinizde şikayet eder, çünkü hepsinin unknown türünde olduğunu bilir.


unknown kullanmanın makul olduğu zamanlar vardır, ancak sizin durumunuzda muhtemelen setinizin yalnızca { keys?: any; fire: any; } türünde değerler tutmasını istiyorsunuz ve başka hiçbir şey. Eğer durum buysa, setinizi oluştururken jenerik tür parametresini açıkça belirtebilir ve böylece onu güçlü şekilde tiplendirebilirsiniz:

const listeners = new Set<{ keys?: any; fire: any; }>();
/* const listeners: Set<{
    keys?: any;
    fire: any;
}> */

Bunun ardından, forEach() yöntemini çağırabilirsiniz ve derleyici her bir öğenin istenildiği gibi { keys?: any; fire: any; } türünde olduğunu bilir:

listeners.forEach(({ keys, fire }) => {
  //some code
}); // no error

Koda yönelik oyun alanı bağlantısı