網站搜尋

typescript - flatMap 需要結果類型


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));
}

flatMap 指令會引發錯誤:

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

如果我將最後一行改為以下內容,它就可以運作:

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

我不明白,因為我給 flatMap 的回呼函式是已知的,而且它會回傳一個 CSVItem 或 CSVItem 陣列,推斷應該可以正常運作,我不應該需要指定 flatMap 呼叫的回傳類型。

TS 遊樂場

答案#1

我剛自己弄清楚如何正確地消除這個錯誤:

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

flatMap 似乎只有在我的 converter 函數返回 ReadonlyArray 而不是普通數組時,才能推斷出 U。

我其實不太明白為什麼,但我的 TypeScript 水平還是在慢慢提升。