根据TypeScript

时间:2017-11-30 13:44:30

标签: typescript generics

是的,对于这个问题的糟糕标题感到抱歉,但很难解释。更简单地显示一些代码并询问为什么这不符合我的意图?

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>`

上述代码can be found here的可编辑版本。

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

我正在尝试的是什么(我现在在TypeScript 2.4.2上)?

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

1 个答案:

答案 0 :(得分:3)

不幸的是,像这样的高级打字的统一并不是开箱即用的。有一点尴尬&#34;扁平&#34;在#34中概述的HKT编码;轻量级高级打字&#34; (TypeScript examples here),您可以从中获得更好的推理。

幸运的是,对于你的例子,有一种更简单的方法来重新安排事情:

...

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

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