是否可以约束特定方法的泛型类?

时间:2016-07-22 12:05:49

标签: typescript applicative fantasyland

假设我在TypeScript中创建了一个容器。它可以是任何容器,但我将使用以下简单示例:

class Container<T> {
  val: T;
  constructor(t: T) {
    this.val = t;
  }
}

说我想提供一个功能,这样如果我有两个带数字的容器,我可以轻松创建一个新容器,并将这些数字加在一起。

class Container<T> {
  val: T;
  constructor(t: T) {
    this.val = t;
  }
  add(c: Container<number>): Container<number> {
    return new Container(this.val + c.val);
  }
}

但是我无法弄清楚是否可以进行上面的代码检查。问题是,我所知道的this.val只是T类型(没什么)。我想以某种方式约束add方法,以便只能在Container<T> T == number的实例上调用它。在TypeScript中可以吗?

以上只是一个人为的例子。我真正想要做的是为applicative functor创建一个TypeScript接口。应用函数有一种方法,Container看起来像这样:

ap<A, B>(c: Container<A>): Container<B> {
  return new Container(this.val(c.val));
}

所以在这种情况下,我必须知道T == (a: A) => B。更一般地说,我希望能够定义这个界面:

interface Applicative<T> {
  ...
  ap: <A, B>(a: Applicative<A>) => Applicative<B> // where T == (a: A) => B
  ...
}

这有可能吗?

2 个答案:

答案 0 :(得分:1)

您对单个方法适用的 T 没有限制。你只能在课堂上拥有它们。

答案 1 :(得分:0)

您可以向泛型类型添加约束。

在你的情况下,你可以这样做:

interface HasNumber {
    x: number;
}

class Container<T extends HasNumber> {
}

但是你可以使用数字,字符串,布尔等基本类型来限制...