我应该用什么来替换
???
?以上尝试均无效。
declare function generic1<T>(t: T): T;
declare function generic2<T>(t: T): { a: T };
declare function generic3<T>(t: T): { b: T[] };
// etc...
// function string_wrapper<F extends <T>(t: T) => any>(f: F): ReturnType<typeof f<string>> {
// function string_wrapper<F extends (t: string) => any>(f: F): ReturnType<F> {
// function string_wrapper<R, F extends (t: string) => R>(f: F): R {
function string_wrapper<F extends ???>(f: F): ??? {
return f('hi'); // should be F<string>
}
const r1 = string_wrapper(generic1); // should be: string
const r2 = string_wrapper(generic2); // should be: { a: string }
const r3 = string_wrapper(generic3); // should be: { b: string[] }
这是 TypeScript 所缺少的功能。目前,您无法使用条件类型推断来实例化泛型函数中的类型参数,就像您调用泛型函数或将泛型函数分配给特定函数类型时那样。 请参阅 microsoft/TypeScript#22617。相反,在推理之前,泛型类型参数首先用它们的constraints实例化。实际上,这意味着当您尝试这样做时,您会得到很多
unknown
。