Как расширить класс JS в ReasonML

Например, у меня есть класс типа es6:

class Foo {...}

И я хочу его расширить:

class Bar extends Foo {...}

В документации причина-реакция я нашел примеры, но не уверен, что они подходят мне:

let component = ReasonReact.reducerComponent "TodoAppRe";
let make _children => {
  ...component,
  initialState: fun () => {count: 0},
  <...>

Но когда я пытаюсь написать код в этом стиле, я получаю сообщение об ошибке:

let myclass unit => {
  ...mysuperclass,
    hello: fun () => {
      Js.log "FooBar";
    }
};

Ошибка: обновление поля несвязанной записи

(В этом примере mysuperclass является внешним из сторонней js-библиотеки).

Может я что то не так делаю?


person S. Zobov    schedule 27.09.2017    source источник


Ответы (1)


let foo bar => { ...baz, quux: ... } - это не синтаксис наследования, это синтаксис композиции. В частности, он принимает значение записи baz (не объект) и обновляет свой quux член (не метод).

Если вы хотите расширить класс JS в Reason / BuckleScript, сначала имейте в виду, что BuckleScript генерирует код, обратно совместимый с ES5, поэтому вам не нужно использовать Babel. Фактически BuckleScript не поддерживает расширение класса напрямую.

Но вы можете включить необработанный JavaScript в исходный код Reason с помощью атрибута [%%bs.raw] в BuckleScript (https://bucklescript.github.io/bucklescript/Manual.html#_embedding_raw_js_code_as_statements):

/* 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, вам нужно будет запустить его через Babel, если вы хотите, чтобы он был обратно совместим с браузерами до ES2015.

person Yawar    schedule 27.09.2017