[英]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
這對我有用。
type Actions = typeof actions;
type AvailableValues = ReturnType<Actions[keyof Actions]>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.