[英]Typescript - How to infer generic in non-invoked function?
請參見下面的示例; 它應該通過對代碼的所有合理解釋來工作。 有沒有人知道為什么沒有?
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.