Typescript 如何根据泛型函数的泛型参数获取正确的返回类型

Typescript 如何根据泛型函数的泛型参数获取正确的返回类型,typescript,Typescript,如果返回类型取决于泛型参数,如何获取函数的正确返回类型 function f1<T>(o: T) { return { a: o } } // I was hoping (n: number) would set T to number: type T1 = typeof f1 extends (n: number) => infer R ? R : never // T1 is unknown 函数f1(o:T){ 返回{a:o} } //我希望(n:number)将

如果返回类型取决于泛型参数,如何获取函数的正确返回类型

function f1<T>(o: T) {
  return { a: o }
}

// I was hoping (n: number) would set T to number:
type T1 = typeof f1 extends (n: number) => infer R ? R : never // T1 is unknown
函数f1(o:T){
返回{a:o}
}
//我希望(n:number)将T设置为number:
类型T1=f1扩展的类型(n:number)=>推断R?R:从不//T1是未知的

我不确定其中的原因,但下面的内容对您来说应该很好

type f1<T> = (o: T) => { a: T }
type T1 = f1<number>
type f1=(o:T)=>{a:T}
T1型=f1型

Typescript将f1视为值而不是类型,因此它无法在运行前创建T1类型

TypeScript目前在大多数类型系统中都缺乏支持,这是表示泛型函数类型上的操作所需要的。所以简单的回答是“对不起,你不能这么做”


解决方法往往涉及手动指定希望是泛型的具体类型,或者通过模拟一些运行时效果说服编译器进行所需的分析。很难从示例代码中分辨出您的确切用例是什么,因此下面的解决方法看起来很愚蠢,但对于您的实际情况,类似的方法可能会奏效

对于前一种手动指定内容的情况,您的示例代码将变得相对无趣:

type T1 = { a: number };
对于后一种假装拥有运行时代码的情况,您可以执行以下操作:

const t1 = true as false || f1(null! as number);
type T1 = typeof t1; // {a: number}
我向编译器撒谎说
true
的类型为
false
,这意味着在运行时表达式
t1
将只调用
true
,而
f1()
永远不会被调用。但是在编译时,编译器认为它是
false | | f1(someNumber)
,因此期望
t1
的类型是
{a:number}

有一种方法允许您使用类型查询操作符
typeof
处理任何表达式,在实现这种方法的世界中,您只需编写

type T1 = typeof f1(123);
并且没有任何运行时代码发出。。。但该提议被拒绝,因此上述代码是一个错误



无论如何,对不起,我没有更好的答案给你。希望这有帮助;祝你好运

我的目标是避免为函数定义显式类型,因为它们已经存在……而且该类型无论如何都不是
f1
函数的类型。因为f1的实类型是表示泛型函数的非泛型类型(对任何类型的参数进行操作),而这里的类型是表示非泛型函数的泛型类型(只能对一种类型的参数进行操作)。他们不一样,谢谢你的解释。我喜欢TS中的HKT,因为如果我开始为一个泛型函数定义类型,那么我需要在执行路径中为所有这些函数定义类型:(