Der beste Weg, ein Konfigurationsobjekt mit Google Closure definieren
-
26-09-2019 - |
Frage
Ich liebe, wie Google Closure Compiler Symbole in Code optimieren. Aber ich habe festgestellt, keinen guten Weg, um öffentliche, exportierten Funktionen zu definieren, die Konfigurationsobjekte als Parameter übernehmen. Betrachten Sie diesen Code-Snippet:
goog.provide('foo');
goog.require('goog.dom');
/** @typedef {{
* id : string,
* clazz : string
* }}
*/
foo.config;
/**
* Does some neat stuff
* @param {foo.config} config
*/
foo.myFoo = function(config) {
var el = goog.dom.getElement(config.id);
goog.dom.classes.add(el, config.clazz);
}
goog.exportSymbol('foo.myFoo', foo.myFoo);
Wir nehmen nun an, dieses Skript laden, und wollen myFoo nennen wie folgt:
<script type="text/javascript">
foo.myFoo({
id: 'unique-id',
clazz: 'pretty'
});
</script>
Wenn kompiliert, würde dies scheitern, weil id und clazz Eigenschaften komprimiert wurden.
Kennt jemand eine elegante Art und Weise zu implementieren und Export Konfigurationsobjekte der Google Closure Compiler?
Lösung
mein Vorschlag wäre, einfach sein, um den Parameter als {Object}
mit Anmerkungen versehen und die Schlüssel zu zitieren, wie folgt:
foo.myFoo({
'id': 'unique-id',
'clazz': 'pretty'
});
...
/**
* Does some neat stuff
* @param {Object} config
*/
foo.myFoo = function(config) {
var el = goog.dom.getElement(config['id']);
goog.dom.classes.add(el, config['clazz']);
}
Andere Tipps
In Bezug auf Konflikte von verstümmelten und rohen Eigenschaftsnamen
Du musst entweder:
- "extern" Ihr Eigenschaftsnamen (so dass sie nicht umbenannt wird)
- Verwendung "eingeklammert Notation", um den Zugriff propertiies
In Bezug auf Konfigurationsobjekte
Nach der docs Closure Compiler, zur Zeit können Sie es nicht tun. Sie haben die param als Objekt zu markieren.
Sie können eine Art definieren, aber es wird Ihnen nicht helfen, weil eine Art erfordert alle die Eigenschaften existieren, aber Sie können nur wenige Parameter in einem Satz Konfigurationsobjekt.
Die Dokumentation Closure Compiler empfiehlt, dass Sie den Parameter als Objekt markieren, sondern dokumentieren die Felder in den Kommentaren.