typescript - flatMap necesită tipul rezultat


type ApiItem = Record<string, unknown>;
type CSVItem = Record<string, unknown>;
type Model = { converter: (item: ApiItem) => CSVItem | CSVItem[] };

function convertItems(model: Model, { main }: { main: ApiItem[] }): CSVItem[] {
    const { converter } = model;

    return main.flatMap((item) => converter(item));
}

Instrucțiunea flatMap generează o eroare:

Type 'unknown[]' is not assignable to type 'CSVItem[]'.
  Type 'unknown' is not assignable to type 'CSVItem'.

Funcționează dacă schimb ultima linie cu:

  return main.flatMap<CSVItem>((item) => converter(item));

Nu înțeleg, deoarece callback-ul pe care îl ofer la flatMap este cunoscut și întoarce un CSVItem sau un array de CSVItem, inferența ar trebui să funcționeze, nu ar trebui să fie nevoie să specific tipul de returnare al apelului flatMap.

Teren de joacă TS

Răspuns #1

Tocmai am descoperit singur cum să scap corect de eroare:

type Model = { converter: (item: ApiItem) => CSVItem | ReadonlyArray<CSVItem> }

flatMap pare să poată deduce U doar dacă funcția mea converter returnează un ReadonlyArray și nu un array obișnuit.

Nu înțeleg cu adevărat de ce, dar nivelul meu de TypeScript încă se încălzește încet.