網站搜尋

箭頭函數的 TypeScript 縮小與普通變數不一致


簡化範例:

變數類型縮小

let a: string | number | boolean;
let b: string = '';
a = b;

這個可以運作,而且沒有任何警告。然而,如果例子是:

let a: (arg: string | number | boolean, record) => boolean;
let b: (arg: string, record) => boolean = (arg, record) => record.name.indexOf(arg) === 0;
a = b;

這會導致一個警告 類型 '(arg: string) => any' 無法指定給類型 '(arg: string | number | boolean) => any'。

我在想為什麼會這樣,因為 b 的類型要求是 a 的子集。

在實際操作中,我正在使用一個 React 庫,而一個組件的 prop 需要一個具有 a 簽名的匿名函數,但我需要使用 b 的簽名,否則 indexOf 會報錯。我該如何讓函數的收窄行為類似於變量的行為?

謝謝。