簡體   English   中英

TypeScript generics 和 function 參數條件類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM