我正在嘗試撰寫一個函式,該函式將另一個函式作為引數,它是 args,然后使用提供的 args 執行該函式并在保留型別的同時回傳結果。
只要提供的函式具有靜態回傳型別,就可以了。但是當該函式的回傳型別取決于引數時,我無法保留回傳型別。
這是我失敗的嘗試。我希望它能澄清我想要實作的目標:
function f<A>(args: A) {
return args
}
// Calling the fuction directely works as expected:
const result = f('test') // OK: type of result is 'test'
// I tried this to be more explicit about the return type but it does not work
type ReturnTypeWithArgs<
F extends (args: any) => any,
A extends Parameters<F>[0],
> = F extends (args: A) => infer R ? R : never
// This is the function I'm trying to build
function callFunction<F extends (args: any) => any, A extends Parameters<F>[0]>(
f: F,
args: A,
): ReturnTypeWithArgs<F, A> {
return f(args)
}
// I'd like to get the same returned type when using callFunction. But it doesn't work:
const result2 = callFunction(f, 'test') // KO: typeof test2 is unknown
uj5u.com熱心網友回復:
目前沒有純粹的型別級別的方法來獲取一個泛型函式型別<T>(t: A<T>) => R<T>和一個引數型別,X并讓編譯器告訴你如果你用 type 的引數呼叫函式時回傳型別是什么X。您不能使用或實用程式型別之類的條件型別推斷;它最終只是用它們的(可能是隱式的)約束替換了泛型型別引數,所以變成了.ReturnType<T>Parameters<T><T>(t: A<T>) => R<T>(t: A<unknown>) => R<unknown>)
在microsoft/TypeScript#40179有一個開放的建議,用于回答上述問題的型別運算子。它被標記為“等待更多反饋”,沒有太多參與。如果您想看到它發生,您可能會去那里,給它一個??,并描述您的用例以及為什么需要它......但它可能不會以某種方式產生太大影響。現在它不是語言的一部分。
目前 TypeScript 對高階泛型操作的支持都涉及一些值級別的代碼,這些代碼使其成為發出的 JavaScript。如果你呼叫一個泛型函式,它會執行你想要的型別操作,但是你不能在某個地方沒有一個函式。
幸運的是,您可以callFunction()通過重構為引數和回傳型別使用單獨的泛型型別引數來撰寫您的函式。也就是說,不要從某個函式型別開始,并嘗試將其引數型別和回傳型別F分開。從和直接開始。這將允許編譯器從microsoft/TypeScript#30215中實作的泛型函式執行其高階型別推斷:ARAR
function callFunction<A, R>(f: (arg: A) => R, args: A): R {
return f(args)
}
const result = callFunction(f, 'test') // string
這就是你想看到的。您沒有得到unknown,而是輸入的實際string型別。
好吧,有一個小的差異,A并且R被推斷為string而不是文字型別 "test"。如果這很重要,您需要給編譯器一個提示,以便在那里推斷出更窄的型別。microsoft/TypeScript#30680有一個問題,要求提供一些簡單的方法來執行此操作,但現在我使用將Narrowable提示型別定義為約束的解決方法。它可能看起來像:
type Narrowable = string | number | boolean | null | undefined | bigint | {};
function callFunction<A extends Narrowable, R>(
f: (arg: A) => R,
args: A,
): R {
return f(args)
}
const result2 = callFunction(f, 'test') // "test"
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511201.html
標籤:打字稿仿制药
