繁体   English   中英

根据TypeScript中的另一个通用参数推断通用类型参数

[英]Inferring generic type parameter based on another generic parameter in TypeScript

是的,对于这个问题的标题很抱歉,但是很难解释。 显示一些代码要简单得多,并问为什么这不符合我的预期?

interface Doer<U> {
    doStuff: () => U;
}

class Promiser implements Doer<Promise<string>> {
    doStuff() {
        return Promise.resolve('foo');
    }
}

export interface Type<T> extends Function {
    new (...args: any[]): T;
}

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

const result = doYourThing(Promiser);
// type of "result" is `{}`
// I want it to be `Promise<string>`

可以在此处找到上述代码的编辑版本。

我什至不确定这是否可行,但我希望TypeScript能够基于参数为Doer<U>类型且实际参数为类型的事实来推断doYourThing()的返回类型。 Doer<Promise<string>>

我什至尝试过(我现在正在使用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>`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM