Einen Konstruktor als Parameter übergeben, als wäre es eine regelmäßige Funktion in JavaScript?JavaScript

Javascript-Forum
Guest
 Einen Konstruktor als Parameter übergeben, als wäre es eine regelmäßige Funktion in JavaScript?

Post by Guest »

Ich verwende Antlr 4 und es ist üblich, eine Klasse zu instanziieren und sie sofort als Argument des Konstruktors der nächsten Klasse zu bestehen, gemäß den Dokumenten für das Antlr 4 JavaScript -Ziel: < /p>

Code: Select all

import antlr4 from 'antlr4';
import MyGrammarLexer from './QueryLexer.js';
import MyGrammarParser from './QueryParser.js';
import MyGrammarListener from './QueryListener.js';

const input = "field = 123 AND items in (1,2,3)"
const chars = new antlr4.InputStream(input);
const lexer = new MyGrammarLexer(chars);
const tokens = new antlr4.CommonTokenStream(lexer);
const parser = new MyGrammarParser(tokens);
const tree = parser.MyQuery();
Eindeutig ist dies eine Situation, die für die Funktionszusammensetzung geeignet ist, und ich verwende Lodash (FP).
Zuerst habe ich Folgendes ausprobiert:

Code: Select all

// imports...
import _ from "lodash/fp.js";

const parse = _.compose([
_.invoke("MyQuery"),
MyGrammarParser,
antlr4.CommonTokenStream,
MyGrammarLexer,
antlr4.InputStream,
]);
, aber dies schlägt bei TypeError: Klassenkonstruktor KE nicht ohne 'New' . Jede Zeile in _.compose (außer _.invoke ) schlägt mit TypeError fehl: Die Eigenschaften von undefined (lesen Sie 'Länge') bei neuem Antlr4.InputStream . < /p>
Stattdessen kann ich eine Helferfunktion verwenden: < /p>

Code: Select all

// imports...
import _ from "lodash/fp.js";

_.construct = Constructor => param => new Constructor(param);

const parse = _.compose([
_.invoke("MyQuery"),
_.construct(MyGrammarParser),
_.construct(antlr4.CommonTokenStream),
_.construct(MyGrammarLexer),
_.construct(antlr4.InputStream),
]);

const tree = parse("field = 123 AND items in (1,2,3)");
< /code>
Dies funktioniert und IMO sieht viel besser aus als das Original, aber ich möchte wissen, ob es eine Möglichkeit gibt, dies mit integrierten JavaScript- oder Lodash-Funktionen zu schreiben. Soweit ich weiß, ist es nicht möglich, einen Konstruktor als Parameter zu übergeben, als wäre es eine reguläre Funktion, daher _.Construct 
. Um einen Konstruktor als Parameter zu übergeben, als wäre es eine reguläre Funktion, ohne ihn zuerst in eine Helferfunktion einwickeln zu müssen. Leitfaden, die Lösung für diese Frage jedoch sollte Lodash/Antlr 4 unabhängig sein.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post