是否可以限制特定方法的通用 类 ?
Is it possible to constrain generic classes for specific methods?
假设我在 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 中可能吗?
以上只是一个人为的例子。我真正想做的是为应用函子创建一个 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
...
}
这有可能吗?
您可以为泛型类型添加约束。
在你的情况下你可以这样做:
interface HasNumber {
x: number;
}
class Container<T extends HasNumber> {
}
但是您不能使用数字、字符串、布尔值等基本类型进行约束...
您不能将 T 的限制应用于单个方法。您只能在 class 级别拥有它们。
假设我在 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 中可能吗?
以上只是一个人为的例子。我真正想做的是为应用函子创建一个 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
...
}
这有可能吗?
您可以为泛型类型添加约束。
在你的情况下你可以这样做:
interface HasNumber {
x: number;
}
class Container<T extends HasNumber> {
}
但是您不能使用数字、字符串、布尔值等基本类型进行约束...
您不能将 T 的限制应用于单个方法。您只能在 class 级别拥有它们。