我有一個帶有選項型別的工廠函式FactoryOptions<T>。
它指定一個可選的items鍵,它本身可以是型別Item[]或(defaultItems: Item[]) => Item[]
目標是允許用戶指定自己的items陣列,保留它undefined并使其默認為固定陣列,或者指定一個函式,該函式采用默認陣列并回傳他們自己的陣列作為回傳值。
function factory<T extends AnyItems = DefaultItems>(options: FactoryOptions<T> = {})
{
const { items: itemsOrFunc = defaultItems } = options;
return typeof itemsOrFunc === 'function' ? itemsOrFunc(defaultItems) : itemsOrFunc;
}
在上面列出的 3 個場景中,我正在努力處理函式的回傳型別。我的目標是在每種情況下都推斷出正確的型別,但相反,我收到了一個聯合型別。這可能嗎?
// returns DefaultItems
const test1 = factory();
// Actual: DefaultItems | Item<string>[]
// Expected: Item<string>[]
const test2 = factory({ items: [foo] })
// Actual: DefaultItems | Item<number>[]
// Expected: Item<number>[]
const test3 = factory({ items: () => [num] })
TS游樂場鏈接
uj5u.com熱心網友回復:
需要條件回傳型別檢查是否T為DefaultItems:
function factory<T extends AnyItems = DefaultItems>(options: FactoryOptions<T> = {}): [T] extends [DefaultItems] ? DefaultItems : T {
將它包裝在一個元組中以防止分發,防止它回傳DefaultItemsif Tis DefaultItems | SomethingElse。這使得它只回傳DefaultItems,如果T只是DefaultItems。
使用此方法需要一個斷言:
return (typeof itemsOrFunc === 'function' ? itemsOrFunc(defaultItems) : itemsOrFunc) as ReturnType<typeof factory<T>>;
如果您不喜歡這里使用條件型別或必須使用斷言,請考慮使用多載作為替代方案(在我看來,無論如何都應該使用)。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/515580.html
標籤:打字稿
