Typescript:泛型扩展带有泛型的类型(高阶类型)

19

假设我有一个接口

interface Applicative<T> {}

现在我想定义一个函数f,它:

  • 接收一个函数和一个类型U,该类型U扩展了包装任何内容的Applicative
  • 并返回一个包装函数的U

如何在Typescript中定义这个函数?

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

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


U也是泛型。抱歉,您不能在泛型参数声明内部声明泛型。也许这可以帮助您: “function f<U extends Applicative<any|Function>>(fn: Function, a: U): U”。 免责声明:我理解这不完全是您想要的。 - TSV
@TSV 谢谢。 这能编译通过,但由于any | Functionany一样好,所以此定义不能保证f返回一个包装函数(且仅为函数)的U。 - Bruno Grieder
另一个我的想法是 "function f<U extends Applicative<any>>(fn: Function, a: U): Applicative<Function>" - 但这并不能给出所需的函数结果类型... - TSV
@TSV;再次感谢,但这次不能保证函数返回的类型是类型U(或派生自类型U)- 这是我要求之一。 - Bruno Grieder
3个回答

19

2
这不完全是你所寻找的,但我认为这是最接近的:

这并不完全符合你的需求,但我认为这是最接近的:

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>

或类似的东西。

1
听起来是一个合理的解决方法。让我测试一下,然后再回来告诉你。 - Bruno Grieder

1

我认为这就是你需要的:

interface Applicative<T> {}
function f<T, U extends Applicative<T>>(fn: Function, a: U)

你需要做的就是为Applicative提供所有所需参数(在这种情况下为T)给f本身,并将U标记为扩展它的其中一个。

至少对我来说是有效的,希望对你的情况也有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接