【问题标题】:Typescript: generic that extends a type with a generic (higher kinded types)Typescript:泛型,使用泛型(更高种类的类型)扩展类型
【发布时间】:2022-01-13 17:02:21
【问题描述】:

假设我有一个接口

interface Applicative<T> {}

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

  • 接受一个函数并接受一个类型 U 扩展一个 Applicative 包装 Any
  • 并返回一个包装函数的 U

如何在 Typescript 中定义这个?

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

是我幼稚的尝试,但这是无效的

【问题讨论】:

  • U 也是通用的。恐怕你不能在泛型参数声明中声明泛型。可能有帮助:“函数 f>(fn: Function, a: U): U”。免责声明:我明白这不是您想要的。
  • @TSV 谢谢。这可以编译,但由于any|Function 与any 一样好,因此此定义不能保证f 返回一个包装函数的U(仅此而已)
  • 我的另一个想法是“function f>(fn: Function, a: U): Applicative”——但这并没有给出所需的函数结果类型。 .
  • @TSV;再次感谢,但这次不能保证函数返回的类型是 U 类型(或派生自 U) - 这是我的要求之一

标签: typescript


【解决方案1】:

不幸的是,打字稿没有(还没有?)实现更高种类的类型。

详情请见https://github.com/Microsoft/TypeScript/issues/1213

【讨论】:

    【解决方案2】:

    这不是您正在寻找的,但它与我认为您可以得到的一样接近:

    interface Applicative<T> {}
    
    function f<U>(fn: Function, a: U & Applicative<any>): U & Applicative<Function> {
    
        return null;
    }
    

    a 必须同时是 U(无论 U 是什么)和 Applicative&lt;any&gt;。 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>
    

    或类似的东西。

    【讨论】:

    • 听起来是一个合理的解决方法。让我测试一下,然后再回复你
    【解决方案3】:

    我认为这是你需要的:

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

    您只需将Applicative(在这种情况下为T)所需的所有参数提供给f本身,并将U标记为扩展它的参数。

    至少这对我有用,希望它也能涵盖你的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      相关资源
      最近更新 更多