fonksiyonel programlama - TypeScript bir Array'i concat ile azaltırken neden 'never' türünü çıkarır?
Kod, dilden daha iyi konuşur, demek ki:
['a', 'b', 'c'].reduce((accumulator, value) => accumulator.concat(value), []);
Kod çok saçma ve kopyalanmış bir Dizi döndürüyor...
TS concat'in argümanında şikayet ediyor: TS2345: 'string' tipi argüman 'ConcatArray' tipi parametreye atanamaz.
Cevap #1
Bunun nedeni, [] için tipin never[] olarak çıkarılmış olmasıdır; bu, boş olması GEREKEN bir dizi için tiptir. Bunu ele almak için bir tip dönüşümü kullanabilirsiniz:
['a', 'b', 'c'].reduce((accumulator, value) => accumulator.concat(value), [] as string[]);
Genellikle bu büyük bir sorun olmaz çünkü TypeScript, boş bir diziye ne yaptığınıza bağlı olarak daha iyi bir tür atamak konusunda oldukça iyi bir iş çıkarır. Ancak, örneğiniz sizin dediğiniz gibi 'saçma' olduğundan, TypeScript herhangi bir çıkarım yapamaz ve türü never[] olarak bırakır.
Cevap #2
İki versiyonda tip belirtimini (diğer adıyla tip dönüşümünü) önleyen daha iyi bir çözüm:
reducemetodunun genel tür parametresi olarakstring[]kullanın (bahsettiği için @depoulo'ya teşekkürler):
['a', 'b', 'c'].reduce<string[]>((accumulator, value) => accumulator.concat(value), []);
accumulatordeğerinistring[]olarak yazın (ve[]üzerinde tip dönüşümünden kaçının):
['a', 'b', 'c'].reduce((accumulator: string[], value) => accumulator.concat(value), []);
Bu çözümle TypeScript oyun alanında oynayın.
Notlar:
Tip doğrulamaları (bazen tip dönüştürmeleri olarak da adlandırılır) mümkünse kaçınılmalıdır çünkü bir tipi alıp başka bir şeye aktarıyorsunuz. Bu, bir değişkeni başka bir tipe manuel olarak zorla dönüştürdüğünüz için yan etkiler yaratabilir.
Bu Typescript hatası yalnızca
strictNullChecksseçeneğitrueolarak ayarlandığında meydana gelir. Typescript hatası bu seçeneği devre dışı bıraktığınızda ortadan kalkar, ancak muhtemelen istediğiniz bu değildir.Google'ın bu konuyu, cevap arayan kişiler için bulabilmesi amacıyla, Typescript hata mesajlarının bazen sürümden sürüme değiştiği için, Typescript
3.9.2ile aldığım tüm hata mesajını burada referans gösteriyorum:No overload matches this call. Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error. Argument of type 'string' is not assignable to parameter of type 'ConcatArray<never>'. Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error. Argument of type 'string' is not assignable to parameter of type 'ConcatArray<never>'.(2769)
