How can I type subclasses in Reasonml?
I have the following in JS (expressed in flow types):
declare class Disposable {
dispose(): void
};
declare class CompositeDisposable extends Disposable {
constructor(...disposables: Array<Disposable>): void;
dispose(): void;
add(...disposables: Array<Disposable>): void;
remove(disposable: Disposable): void;
clear(): void;
}
and I want to create bindings for CompositeDisposable
where CompositeDisposable.add
can receive either CompositeDisposable
or Disposable
.
So far, I could get this
type disposable;
module CompositeDisposable = {
type t;
[@bs.new] [@bs.module "atom"] external create : unit => t = "CompositeDisposable";
[@bs.send] external dispose : t => unit = "dispose";
[@bs.send] external add : (t, disposable) => unit = "add";
[@bs.send] external remove : (t, disposable) => unit = "remove";
[@bs.send] external clear : t => unit = "clear";
};
module OtherLibrary = {
[@bs.send] external getDisposable : unit => disposable = "getDisposable";
};
let compositeDisposable = CompositeDisposable.create();
let compositeDisposable2 = CompositeDisposable.create();
let disposable = OtherLibrary.getDisposable();
CompositeDisposable.add(compositeDisposable, disposable);
CompositeDisposable.add(compositeDisposable, compositeDisposable2);
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error:
------
This has type:
CompositeDisposable.t
But somewhere wanted:
disposable
*/
CompositeDisposable.dispose(compositeDisposable);