簡體   English   中英

有沒有辦法推斷通用 function 類型定義的 function 參數的返回類型?

[英]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();

Playground 代碼鏈接

暫無
暫無

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

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