4

例如,我有一个类似 es6的类:

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";
    }
};

错误:未绑定记录字段更新

(在这个例子mysuperclass中是来自 3rd-party js-library 的外部)。

也许我做错了什么?

4

1 回答 1

4

let foo bar => { ...baz, quux: ... }不是继承的语法,而是组合的语法。具体来说,它获取baz记录值(不是对象)并更新其quux成员(不是方法)。

如果你想在 Reason/BuckleScript 中扩展一个 JS 类,首先要记住 BuckleScript 生成的代码向后兼容 ES5,所以你不需要使用 Babel。事实上 BuckleScript 并不直接支持扩展类。

但是,您可以使用 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然后您可以在下面的代码中编写与该类的绑定:

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 运行它。

于 2017-09-27T18:48:43.800 回答