You can use this hack I came up with to have the type checker verify that a class is a supertype of multiple types.
type Flying = {
fly : () -> ();
};
type Swimming = {
swim : () -> ();
};
type Walking = {
walk : () -> ();
};
class Bird() {
public func fly() {};
public func walk() {};
};
// Flying <: Bird
let _ : () -> Flying = Bird;
// Walking <: Bird
let _ : () -> Walking = Bird;
class Dog() {
public func swim() {};
public func walk() {};
};
// Swimming <: Dog
let _ : () -> Swimming = Dog;
// Walking <: Dog
let _ : () -> Walking = Dog;
For example, if you were to say that Walking <: Dog
(using the let
-bound technique I showed here) and then accidentally omitted the walk
method from the definition of Dog
you would get this error:
main.mo:70.25-70.28: type error, expression of type
() -> Dog
cannot produce expected type
() -> Walking
If your class constructor takes arguments then you need to pass those along too:
class Dog(name_ : Text) {
var name = name_;
public func swim() {};
public func walk() {};
};
// Swimming <: Dog
let _ : Text -> Swimming = func(name : Text) { Dog(name) };
// Walking <: Dog
let _ : Text -> Walking = func(name : Text) { Dog(name) };