如何在 ReasonML 中扩展 JS class
How to extend JS class in ReasonML
例如,我有一个 es6-like class:
class Foo {...}
我想扩展它:
class Bar extends Foo {...}
在 reason-react 文档中我找到了示例,但我不确定它是否适合我:
let component = ReasonReact.reducerComponent "TodoAppRe";
let make _children => {
...component,
initialState: fun () => {count: 0},
<...>
但是当我尝试用这种风格编写代码时,出现错误:
let myclass unit => {
...mysuperclass,
hello: fun () => {
Js.log "FooBar";
}
};
Error: Unbound record field update
(在这个例子中 mysuperclass
是来自第三方 js-library 的外部)。
也许我做错了什么?
let foo bar => { ...baz, quux: ... }
不是继承的语法,而是组合的语法。具体来说,它获取 baz
记录值(不是对象)并更新其 quux
成员(不是方法)。
如果你想在 Reason/BuckleScript 中扩展一个 JS class,首先要记住 BuckleScript 生成的代码向后兼容 ES5,所以你不需要使用 Babel。事实上 BuckleScript 并不直接支持扩展 class.
但是,您可以使用 BuckleScript 的 [%%bs.raw]
属性 (https://bucklescript.github.io/bucklescript/Manual.html#_embedding_raw_js_code_as_statements) 在您的 Reason 源代码中包含原始 JavaScript:
/* MyProject_Animal.re */
[%%bs.raw {|
// Dummy class for example:
class Animal {
speak() {}
}
// or:
// import Animal from "somewhere";
class Dog extends Animal {
_name;
constructor(name) {
super();
this._name = name;
}
speak() {
console.log(`${this._name} says woof!!`);
super.speak();
}
}
|}];
然后你可以在下面的代码中写一个到 Dog
class 的绑定:
module Animal_Dog = {
type t;
[@bs.new] external make: string => t = "Dog";
/* Need this to ensure correct usage in other modules */
let make = make;
[@bs.send] external speak: t => unit = "";
};
let spot = Animal_Dog.make("Spot");
Animal_Dog.speak(spot);
但是,请记住,从这个 ES2015 开始,如果您希望它向后兼容 ES2015 之前的浏览器,您将需要通过 Babel 运行 它。
例如,我有一个 es6-like class:
class Foo {...}
我想扩展它:
class Bar extends Foo {...}
在 reason-react 文档中我找到了示例,但我不确定它是否适合我:
let component = ReasonReact.reducerComponent "TodoAppRe";
let make _children => {
...component,
initialState: fun () => {count: 0},
<...>
但是当我尝试用这种风格编写代码时,出现错误:
let myclass unit => {
...mysuperclass,
hello: fun () => {
Js.log "FooBar";
}
};
Error: Unbound record field update
(在这个例子中 mysuperclass
是来自第三方 js-library 的外部)。
也许我做错了什么?
let foo bar => { ...baz, quux: ... }
不是继承的语法,而是组合的语法。具体来说,它获取 baz
记录值(不是对象)并更新其 quux
成员(不是方法)。
如果你想在 Reason/BuckleScript 中扩展一个 JS class,首先要记住 BuckleScript 生成的代码向后兼容 ES5,所以你不需要使用 Babel。事实上 BuckleScript 并不直接支持扩展 class.
但是,您可以使用 BuckleScript 的 [%%bs.raw]
属性 (https://bucklescript.github.io/bucklescript/Manual.html#_embedding_raw_js_code_as_statements) 在您的 Reason 源代码中包含原始 JavaScript:
/* MyProject_Animal.re */
[%%bs.raw {|
// Dummy class for example:
class Animal {
speak() {}
}
// or:
// import Animal from "somewhere";
class Dog extends Animal {
_name;
constructor(name) {
super();
this._name = name;
}
speak() {
console.log(`${this._name} says woof!!`);
super.speak();
}
}
|}];
然后你可以在下面的代码中写一个到 Dog
class 的绑定:
module Animal_Dog = {
type t;
[@bs.new] external make: string => t = "Dog";
/* Need this to ensure correct usage in other modules */
let make = make;
[@bs.send] external speak: t => unit = "";
};
let spot = Animal_Dog.make("Spot");
Animal_Dog.speak(spot);
但是,请记住,从这个 ES2015 开始,如果您希望它向后兼容 ES2015 之前的浏览器,您将需要通过 Babel 运行 它。