2017-09-27 2 views
2

Zum Beispiel zu erweitern, ich habe eine es6 -artige Klasse:Wie JS Klasse in ReasonML

class Foo {...}

Und ich will es erweitern:

class Bar extends Foo {...}

In reason-react Dokumentation Ich fand Beispiele, aber ich bin mir nicht sicher, ob es für mich angemessen ist:

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

Aber wenn ich versuche, Code in diesem Stil zu schreiben, erhalte ich eine Fehlermeldung:

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

Error: Unbound record field update

(In diesem Beispiel mysuperclass ist extern von 3rd-Party-js-Bibliothek).

Vielleicht mache ich etwas falsch?

Antwort

2

let foo bar => { ...baz, quux: ... } ist keine Syntax für die Vererbung, es ist eine Syntax für die Zusammensetzung. Insbesondere nimmt es den baz Datensatzwert (kein Objekt) und aktualisiert seinen quux Member (keine Methode).

Wenn Sie eine JS-Klasse in Reason/BuckleScript erweitern möchten, beachten Sie, dass BuckleScript Code generiert, der abwärtskompatibel mit ES5 ist, sodass Sie Babel nicht verwenden müssen. Tatsächlich unterstützt BuckleScript nicht direkt das Erweitern einer Klasse.

Aber, wenn Sie möchten, können Sie rohen JavaScript in Ihrem Grunde Quellcode mit BuckleScript des [%%bs.raw] Attribut (https://bucklescript.github.io/bucklescript/Manual.html#_embedding_raw_js_code_as_statements) schließen ein:

[%%bs.raw{| 
class Bar extends Foo { ... } 
|}] 

Und dann können Sie eine Bindung an die Bar Klasse in dem folgenden Code schreiben Das.

Aber denken Sie daran, dass Sie dieses ES2015 über Babel ausführen müssen, wenn es rückwärtskompatibel mit Browsern vor ES2015 sein soll.

Verwandte Themen