0

假设我在 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>where的实例上调用T == number。这在 TypeScript 中可能吗?

以上只是一个人为的例子。我真正想做的是为应用函子创建一个 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
  ...
}

这有可能吗?

4

2 回答 2

1

您不能对适用于单个方法的T进行限制。您只能在班级级别拥有它们。

于 2016-07-27T07:25:34.607 回答
0

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

在您的情况下,您可以执行以下操作:

interface HasNumber {
    x: number;
}

class Container<T extends HasNumber> {
}

但是您不能使用数字、字符串、布尔值等基本类型进行约束...

于 2016-07-22T14:13:55.773 回答