基于TypeScript中的另一个泛型参数推断泛型类型参数

基于TypeScript中的另一个泛型参数推断泛型类型参数,typescript,generics,Typescript,Generics,是的,很抱歉这个问题的标题很糟糕,但很难解释。显示一些代码并询问为什么这不能按我的意愿工作要简单得多: 接口执行器{ doStuff:()=>U; } 类Promiser实现Doer{ 多斯塔夫(){ 返回承诺。解决(“foo”); } } 导出接口类型扩展函数{ 新(…args:any[]):T; } 函数doYourThing(doer:Type):U{ 返回新的doer().doStuff(); } const result=doYourThing(Promiser); //“结果”的类型

是的,很抱歉这个问题的标题很糟糕,但很难解释。显示一些代码并询问为什么这不能按我的意愿工作要简单得多:

接口执行器{
doStuff:()=>U;
}
类Promiser实现Doer{
多斯塔夫(){
返回承诺。解决(“foo”);
}
}
导出接口类型扩展函数{
新(…args:any[]):T;
}
函数doYourThing(doer:Type):U{
返回新的doer().doStuff();
}
const result=doYourThing(Promiser);
//“结果”的类型为`{}`
//我希望它是`承诺'`
上述代码的可编辑版本

我甚至不确定这是否可行,但我希望TypeScript能够根据参数类型为
Doer
而实际参数类型为
Doer
的事实推断
doYourThing()
的返回类型

我正在尝试的是可能的吗(我现在正在使用TypeScript 2.4.2)


如果是这样,我在这里做错了什么?

不幸的是,像这样的高级类型的统一并不能立即实现。在“轻量级高级类型键入”(TypeScript示例)中,有一种更为笨拙的HKT“扁平化”编码,您可以从中获得更好的推断

幸运的是,在您的示例中,有一种更简单的方法可以重新安排事情:

...

function doYourThing<T>(doer: Type<Doer<T>>): T {
    return new doer().doStuff();
}

const result = doYourThing(Promiser);
// result is `Promise<string>`
。。。
函数doYourThing(doer:Type):T{
返回新的doer().doStuff();
}
const result=doYourThing(Promiser);
//结果是“承诺”`
...

function doYourThing<T>(doer: Type<Doer<T>>): T {
    return new doer().doStuff();
}

const result = doYourThing(Promiser);
// result is `Promise<string>`