是的,对于这个问题的糟糕标题感到抱歉,但很难解释。更简单地显示一些代码并询问为什么这不符合我的意图?:
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上)?
如果是这样,我在这里做错了什么?
答案 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>`