[英]TypeScript generics and function parameter conditional types
假設我有一個 function,它返回傳入的getIdentifier
function 的返回值。 這個 function 是強制性的,除非該item
具有id
屬性,因為我可以回退到閱讀那個。
type FuncArg<T> = T extends { id: string }
? { item: T; getIdentifier?: (item: T) => string }
: { item: T; getIdentifier: (item: T) => string };
type withId<T> = T & { id: string };
const getFoobar = <T>(arg: FuncArg<T>) => {
return arg.getIdentifier ? arg.getIdentifier(arg.item) : (arg.item as withId<T>).id;
};
到目前為止一切順利。 假設我有第二個 function 將一個項目傳遞給第一個 function,檢查它是否有一個id
,如果沒有,它傳遞一個隨機生成器getIdentifier
。
const getFoobar2 = <T>(item: T) => {
if ('id' in item) return getFoobar({item: item as withId<T>});
return getFoobar({item: item, getIdentifier: () => Math.random().toString()});
}
不幸的是,最后一個示例中的類型檢查中斷了,我不知道要解決這個問題。 我嘗試了從條件類型到聯合類型和 function 重載的所有方法。 每次我遇到類似的問題。 我在這里想念什么?
您錯過了getIdentifier
function 簽名中的item
參數,看起來它需要在 object 聲明中顯式as FuncArg<T>
。 無法解釋得更好,對Typescript沒有太多經驗。
const getFoobar2 = <T>(item: T) => {
if ('id' in item)
return getFoobar({ item: item } as FuncArg<T>);
return getFoobar({item: item, getIdentifier: (item: T) => Math.random().toString()} as FuncArg<T>);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.