Flatten fonksiyonu için TypeScript tür tanımı


Basit bir flatten fonksiyonum var. Fikir, bunun string dizilerini veya string dizilerinin dizilerini alabilmesi ve her zaman sadece 1 seviye string dizisi döndürmesidir. Örneğin:

flatten(['a', ['b']]) // returns ['a', 'b']
flatten(['a', 'b']) // returns ['a', 'b']

İşte bu fonksiyonun uygulaması

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
   return [].concat(...arr);
}

Aşağıdaki TypeScript derleyici hatasını alıyorum:

  error TS2769: No overload matches this call.
    Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
      Argument of type 'string | string[]' is not assignable to parameter of type 'ConcatArray<never>'.
        Type 'string' is not assignable to type 'ConcatArray<never>'.
    Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
      Argument of type 'string | string[]' is not assignable to parameter of type 'ConcatArray<never>'.
        Type 'string' is not assignable to type 'ConcatArray<never>'.

  105   return [].concat(...arr);
                        ~~~~~~

Bu flatten fonksiyonunun giriş ve çıkış türlerini nasıl tanımlayabilirim? any türünü kullanmaktan kaçınmak istiyorum.

Cevap #1

Sanırım derleyici, [] değerinin hangi dizi türü olması gerektiğini anlayamıyor. Buradaki en kolay çözüm, bunu bir tür onayı ile string[] olduğunu söyler:

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
   return ([] as string[]).concat(...arr);
}

Umarım yardımcı olur; iyi şanslar!

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

Cevap #2

Dönülen değer için türü belirtmelisiniz, bu durumda bir dizi string.

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
    const output: string[] = [];
    return output.concat(...arr);
}