说我有一个界面
interface Applicative<T> {}
现在我想定义一个函数f
:
如何在Typescript中定义它?
function f<U extends Applicative>(fn: Function, a: U<any>): U<Function>
是我天真的尝试,但这是无效的
答案 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>
或类似的东西。