假设我有一个接口
interface Applicative<T> {}
现在我想定义一个函数f
,它:
- 接收一个函数和一个类型U,该类型U扩展了包装任何内容的Applicative
- 并返回一个包装函数的U
如何在Typescript中定义这个函数?
function f<U extends Applicative>(fn: Function, a: U<any>): U<Function>
这是我的天真尝试,但这是无效的。
假设我有一个接口
interface Applicative<T> {}
现在我想定义一个函数f
,它:
如何在Typescript中定义这个函数?
function f<U extends Applicative>(fn: Function, a: U<any>): U<Function>
这是我的天真尝试,但这是无效的。
不幸的是,typescript目前还没有实现高阶类型(higher kinded types)。
请查看https://github.com/Microsoft/TypeScript/issues/1213获取更多细节。
这并不完全符合你的需求,但我认为这是最接近的:
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>
我认为这就是你需要的:
interface Applicative<T> {}
function f<T, U extends Applicative<T>>(fn: Function, a: U)
你需要做的就是为Applicative
提供所有所需参数(在这种情况下为T
)给f
本身,并将U
标记为扩展它的其中一个。
至少对我来说是有效的,希望对你的情况也有所帮助。
any | Function
和any
一样好,所以此定义不能保证f
返回一个包装函数(且仅为函数)的U。 - Bruno Grieder