[英]Is there a way to infer the return type of a function parameter of a generic function type definition?
假設我有一個“中間人”function 的類型定義,如下所示:
type Middleman = (
callback: () => any
) => any
此 function 執行“某些任務”,然后調用“回調”並返回其值。 現在,Middleman 和回調都被鍵入以返回任何內容,但我想強烈鍵入它。
我嘗試過引入一個類型參數,如下所示:
type Middleman<T> = (
callback: () => T
) => T
但這在嘗試創建此 function 的實現時會導致問題:
const middlemanImpl: Middleman<T> = cb => cb(); // Error, no way to get T here
正如中間人所期望的那樣,“T”似乎無法從每個呼叫站點推斷出來。
有沒有辦法實現我在這里想要實現的目標? 即:通用 function 的類型定義,它返回作為參數傳遞的 function 的返回值的類型?
您不希望Middleman
真正成為引用特定 function 的泛型類型:
type BadMiddleman<T> = (callback: () => T) => T;
在這個版本中,你不能在不指定類型參數T
的情況下提及類型BadMiddleman
。 一旦你這樣做了,對 function 的任何調用都必須使用指定的類型T
:
const numMiddleman: BadMiddleman<number> = cb => cb();
numMiddleman(() => 12); // okay
numMiddleman(() => "abc"); // error
相反,您希望Middleman
成為引用通用 function 的特定類型。 區別在於泛型類型參數的scope:
type Middleman = <T>(callback: () => T) => T;
const middlemanImpl: Middleman = cb => cb(); // okay
現在是對Middleman
類型的 function 的調用決定了T
是什么類型:
const num = middlemanImpl(() => 12); // okay
num.toFixed();
const str = middlemanImpl(() => "abc"); // okay
str.toUpperCase();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.