【问题标题】:Typescript: Is there a way to put generic constraint on a generic class inside a method?打字稿:有没有办法将泛型约束放在方法内的泛型类上?
【发布时间】:2019-10-28 21:40:57
【问题描述】:

我有如下所示的一元数据结构:

export abstract class Data<A> {
  static initial<A>(): Data<A> {
    return new Initial<A>()
  }

  static failed<A>(error?: any): Data<A> {
    return new Failed<A>(error)
  }

  static loaded<A>(value: A): Data<A> {
    return new Loaded<A>(value)
  }

  static loading<A>(): Data<A> {
    return new Loading<A>()
  }

  static getData<A>(data: Loaded<A>): A {
    return data.getData()
  }

  constructor(public readonly kind: Kind) {}

  abstract map<B>(f: (a: A) => B): Data<B>

  abstract chain<B>(f: (a: A) => Data<B>): Data<B>

  abstract flatMap<B>(f: (a: A) => Data<B[]>): Data<B>[]
}

InitialFailedLoadedLoading 是我的类型的四种不同“形状”。

有时在我的代码中我会得到一个Data&lt;A&gt;[],我想根据A 上的条件进行过滤。我目前的实现是这样的:

  static filter<A>(data: Data<A>[], pred: (a:A) => boolean): Data<A>[] {
    return data.filter(datum => {
      if(datum.isLoaded()) {
        return pred(datum.data)
      }
      return false
    })
  }

大部分代码使用链式方法,例如:

data.map(...).filter(...).doThis().doThat()

但由于static,有时订单会变得混乱:

Data.filter(data.map(...).flatMap(...), myPredicate).map(...).doThis(...) ........

我想知道是否有办法使这个函数成为非静态函数并使用“流畅”的链接方法?

我应该为此扩展数组的原型吗?

【问题讨论】:

  • isLoaded()Datadata 属性在哪里定义?还有InitialFailedLoadedLoading?通常,当您在问题中包含代码时,它应该构成minimal reproducible example,这样代码的唯一问题就是您要询问的问题。这有时意味着删除对外部依赖项的引用并用精简/模拟/虚拟版本替换它们。理想情况下,有人能够将您的代码放入独立的 IDE(如 this)并立即着手对其进行修改以制定潜在的解决方案。
  • 我删除了isLoaded()isLoading() 等谓词来缩短代码,我认为从他们的名字中可以清楚地看出他们只是断言Data&lt;A&gt; 处于什么状态。但是做一个在线代码沙箱也不错。感谢您的意见。

标签: javascript arrays typescript monads


【解决方案1】:

你不应该在你的 filter 函数中调用 Array::filter,你应该只返回包装的谓词函数:

static loadedAnd<A>(pred: (a:A) => boolean): Data<A> => boolean {
  return datum => datum.isLoaded() && pred(datum.data);
}

这样写

data.map(...).flatMap(...).filter(Data.loadedAnd(myPredicate)).map(...).doThis(...)
//                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^

【讨论】:

  • 对于当前的具体示例来说,这实际上是一个好主意,我想知道一些更通用的东西,关于根据A 中的A 的类型制作同一方法的不同版本Data&lt;A&gt;
  • @MehdiSaffar 不确定您的意思 - 该方法已经是通用的 A?您还有哪些其他用例(针对“不同版本”)?
  • 我的意思是类被定义为Data&lt;A&gt;,但是如果我想让一个方法只适用于Data具有Data&lt;A[]&gt;Data&lt;Promise&lt;A&gt;&gt;形状的特殊情况,例如和以不同的方式处理事情。
  • @MehdiSaffar 那么为此写一个特殊的方法?
  • 你能给我看一个这样的例子吗?我准确地说,该方法是实例方法而不是静态方法。
猜你喜欢
  • 1970-01-01
  • 2022-11-23
  • 2020-08-03
  • 2021-04-20
  • 1970-01-01
  • 2015-05-02
  • 2019-09-23
  • 2021-08-13
  • 1970-01-01
相关资源
最近更新 更多