簡體   English   中英

Typescript - 如何在未調用的 function 中推斷泛型?

[英]Typescript - How to infer generic in non-invoked function?

請參見下面的示例; 它應該通過對代碼的所有合理解釋來工作。 有沒有人知道為什么沒有?

TS-游樂場鏈接


const func_returnsInput = (input: string) : Promise<string> => Promise.resolve(input);

type returnsInput_T = <T>(data: T) => Promise<T>;

const test: returnsInput_T = func_returnsInput;

**ERROR**
Type '(input: string) => Promise<string>' is not assignable to type 'returnsInput_T'.
  Types of parameters 'input' and 'data' are incompatible.
    Type 'T' is not assignable to type 'string'.(2322)

func_returnsInput的類型簽名是:

const func_returnsInput: (input: string) => Promise<string>

這是一個 function 接受一個string (並且只接受一個string )並返回一個Promise<string> 您可以稍微更改實現,它仍然符合帶注釋的類型簽名:

const func_returnsInput = (input: string): Promise<string> =>
    Promise.resolve(input.toUpperCase());

實現不這樣做的事實對編譯器並不重要。 它認為調用簽名是 function 的外部可見類型,並且隱藏任何具體實現。 如果有人遞給我func_returnsInput ,我所知道的是它接受一個string並返回一個Promise<string> 如果我要給它喂一個number ,那么我做錯了什么。


現在將其與ReturnsInput_T類型進行對比:

type ReturnsInput_T = <T>(data: T) => Promise<T>;

這是一個帶有泛型類型參數T泛型調用簽名。 類型參數可以由 function 的調用者隨意指定,而不是由 function 的實現者指定。類型ReturnsInput_T是一個 function,它接受調用者想要的任何值(比如,一個number ),然后返回一個Promise相同的數據類型(因此, Promise<number> )。

如果有幫助,您可以將通用調用簽名視為T的所有可能類型的無限交集 你不能把它寫出來,但它的行為就像

type ReturnsInput_T_Infinite =
    & ((data: string) => Promise<string>) 
    & ((data: number) => Promise<number>)
    & ((data: boolean) => Promise<boolean>)
    & ((data: Date) => Promise<Date>)
    & ((data: null) => Promise<null>)
    // & ...

現在,為什么不能將func_returnsInput分配給ReturnsInput類型的值,這很有可能是有道理的:

const test: ReturnsInput_T = func_returnsInput; // error!
// Type 'T' is not assignable to type 'string'.

test(123); // no error

如果test確實是ReturnsInput_T類型,那么我應該被允許調用test(123)test(false)test(new Date())或任何我想要的,並取回相同數據類型的Promise 但是編譯器不知道func_returnsInput (即使實現恰好這樣做)。

所以你得到一個錯誤!

游樂場代碼鏈接

我認為問題在於您想要使用帶有泛型的 function 類型和帶有顯式字符串的 function 類型。 以下對我有用:

type returnsInput_T = <T>(data: T) => Promise<T>;


function func_returnsInput<T>(input: T) {
    return Promise.resolve(input)
}

const test: returnsInput_T = func_returnsInput; 

希望對您有所幫助

暫無
暫無

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

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