6

Ich implementiere derzeit die static land Spezifikation (eine Alternative von Fantasy Land). Ich möchte nicht nur einfache Objekte als Typen verwenden, sondern auch ES2015-Klassen mit statischen Methoden. Ich habe diese statischen Methoden als Pfeilfunktionen in Curry-Form anstelle von normalen Funktionen implementiert. Dies ist jedoch nicht möglich, mit ES2015 Klassen:Klassen mit statischen Pfeilfunktionen

class List extends Array { 
    static map = f => xs => xs.map(x => f(x)) 
    static of = x => [x] 
} 

Mein map nicht braucht seine eigene this, da es sich lediglich um eine curried Funktion auf dem List Konstruktor. Damit es funktioniert muss ich static map(f) { return xs => xs.map(x => f(x)) } schreiben, was sehr nervig ist.

  • Warum kann ich keine Pfeilfunktionen zusammen mit einem Zuweisungsausdruck in ES2015-Klassen verwenden?
  • Gibt es einen prägnanten Weg, um mein Ziel zu erreichen?
  • +1

    Wenn alles statisch ist, warum "erweitert Array"? –

    +0

    möglich duplicate von https://stackoverflow.com/questions/32545495/es6-class-instance-properties? – Bergi

    +0

    @ T.J.Die Idee besteht darin, eine vorhandene Bibliothek statisch kompatibel zu machen. Es wird also Klassen mit nicht statischen Eigenschaften geben, die erweitert werden müssen. – ftor

    Antwort

    10

    Warum kann ich keine Pfeilfunktionen zusammen mit einem Zuweisungsausdruck in ES2015-Klassen verwenden?

    Weil das einfach nicht ist, wie die ES2015-Klasse Syntax für   — jetzt ausgelegt ist, siehe unten unter der Leitung.

    Gibt es einen kurzen Weg, um mein Ziel zu erreichen?

    Es ist mir nicht klar, dass Sie Klassen überhaupt wollen, nur ein Objekt: (. Sie haben gesagt, dass erstreckt, ist wichtig, was Sie tun)

    const List = { 
        map: f => xs => xs.map(x => f(x)), 
        of: x => [x] 
    }; 
    

    aber wenn Sie List wollen Array erweitern (zB Sie Instanzen haben), aber dann diese Statik, um es hinzuzufügen, müssen Sie ein zweistufiger:

    class List extends Array { 
    } 
    Object.assign(List, { 
        map: f => xs => xs.map(x => f(x)), 
        of: x => [x] 
    }); 
    

    Wenn Sie sie nicht aufzählbar oder nicht konfigurierbar usw. möchten, möchten Sie Object.defineProperties statt Object.assign; Ich werde das für den Leser als Übung verlassen ...


    Es gibt eine stage 2 proposal für die Klasse ist „Felder“, einschließlich der statischen Felder. Wenn es bis zu Stufe 4 fortschreitet, wird es eventuell Teil einer kommenden Sprachspezifikation sein (vielleicht ES2018; zu diesem Zeitpunkt unwahrscheinlich, um ES2017 zu machen, aber man weiß es nie).

    Es wäre statische Felder in der Klasse deklariert erlauben, fast genau so, wie Sie sie zeigte:

    // NOT IN THE LANGUAGE YET, BUT A PROPOSAL AT STAGE 2 
    class List extends Array { 
        static map = f => xs => xs.map(x => f(x)); 
        static of = x => [x]; 
    } 
    

    Wenn Sie mit Babel transpile, können Sie es sagen, Stufe 2 Vorschläge aufzunehmen.

    +1

    Danke für den Link und die schnelle Antwort. – ftor

    Verwandte Themen