Typescript:使用泛型扩展类型的泛型

时间:2015-11-30 08:47:52

标签: typescript

说我有一个界面

interface Applicative<T> {}

现在我想定义一个函数f

  • 接受一个函数并采用类型U扩展Applicative wrapped Any
  • 并返回包裹函数的U

如何在Typescript中定义它?

 function f<U extends Applicative>(fn: Function, a: U<any>): U<Function>

是我天真的尝试,但这是无效的

2 个答案:

答案 0 :(得分:4)

不幸的是,打字稿不会(但是?)实现更高的kinded类型。

有关详细信息,请参阅https://github.com/Microsoft/TypeScript/issues/1213

答案 1 :(得分:1)

这并不是你想要的,但它与我认为你能得到的一样接近:

interface Applicative<T> {}

function f<U>(fn: Function, a: U & Applicative<any>): U & Applicative<Function> {

    return null;
}

a必须同时为U(无论U是什么)和Applicative<any>。我担心U无法明确定义为通用类型。

可以通过以下方式实现更好的打字:

function f<U, V>(fn: Function, a: U & Applicative<V>): U & Applicative<Function> { }

我不完全确定我的示例中的返回类型正是您想要的。但是你应该能够通过在返回类型上添加/更改所需的接口来实现所需的结果,例如:

function f<U, V>(fn: Function, a: U & A<V>): U & A<Function>
function f<U, V>(fn: Function, a: U & A<V>): U & A<Function> & B<V>

或类似的东西。