Let's say I create a container in TypeScript. It could be any container but I'll use the following simple example:
class Container<T> {
val: T;
constructor(t: T) {
this.val = t;
}
}
Say I'd like to offer a function so that if I have two containers with numbers in, I can easily create a new container with those numbers added together.
class Container<T> {
val: T;
constructor(t: T) {
this.val = t;
}
add(c: Container<number>): Container<number> {
return new Container(this.val + c.val);
}
}
However I cannot figure out if it is possible to make the above code typecheck. The problem is that all I know about this.val
is that it is of type T
(which is nothing). I'd like to somehow constrain the add
method so that it can only be invoked on instances of Container<T>
where T == number
. Is that possible in TypeScript?
The above is just a contrived example. What I actually want to do is to create a TypeScript interface for applicative functors. An applicative function has a method that for Container
would look like this:
ap<A, B>(c: Container<A>): Container<B> {
return new Container(this.val(c.val));
}
So in this case I would have to know that T == (a: A) => B
. More generally I'd like to be able to define this interface:
interface Applicative<T> {
...
ap: <A, B>(a: Applicative<A>) => Applicative<B> // where T == (a: A) => B
...
}
Is any of this possible?
You can't have a restriction for T that applies on a single method. You can only have them at class level.