簡體   English   中英

簡化 ReturnType 以合並 object 中的多個函數

[英]Simplify ReturnType for union of multiple functions from an object

我有一個 object 的函數,我需要創建一個類型,它是它們返回的內容的聯合。 一個簡單的例子:

const actions = {
  success: () => true,
  count: () => 0,
};

現在,我想創建相應的類型。 這可以通過以下方式完成:

type AvailableValues = ReturnType<typeof actions.success | typeof actions.failure>;

這行得通,但非常冗長——主要是必須重復編寫typeof actions

Pick<typeof actions, 'success' | 'failure'> Pick<typeof actions, 'success' | 'failure'>很接近,但它生成的類型是 object 而不是 function 返回類型的聯合,所以我有點回到我開始的地方。

有沒有辦法同時提取多個返回類型?

See a setup example here: https://www.typescriptlang.org/play?#code/MYewdgzgLgBAhsKBLcEYF4YG8BQMYQCuwwAphBAFwwAUAlBgHwxQBOhpANHjKIWFGr0mMAAzcAvgG4cOKAE8ADqRgBBAG5wkAGzgAjbaQBqcbRzSYASqSiFWYACpLSAHgXKQAM3iIUkAHREJORoAD4szl4+yKj+fAKMUkA

如果actions有一些非函數,或者由於某種原因您需要手動指定"success""count" (也許還有其他函數您想要返回類型),那么您可以通過使用查找類型獲取"success""count"鍵處的函數類型,如下所示:

type AvailableValues = ReturnType<(typeof actions)['success' | 'count']>

查找類型是括號表示法,其中給定類型T和鍵類型K (或鍵的聯合),那么該鍵的屬性類型(或這些鍵的屬性類型的聯合)是T[K]


如果你想得到一個對象類型的所有函數值屬性的返回類型的聯合,你可以這樣寫:

type ReturnTypesOfFunctionProps<T> = {
  [K in keyof T]: T[K] extends (...args: any) => infer R ? R : never
}[keyof T];

請注意T[K] extends (...args: any) => infer R ? R : never T[K] extends (...args: any) => infer R ? R : never使用條件類型推斷,基本上與ReturnType<T[K]> (參見庫定義)相同, ReturnType限制其輸入。

然后對於您的類型,它會產生相同的結果:

type AvailableValues2 = ReturnTypesOfFunctionProps<typeof actions>;
// type AvailableValues2 = number | boolean

Playground 鏈接到代碼

這對我有用。

type Actions = typeof actions;

type AvailableValues = ReturnType<Actions[keyof Actions]>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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