Matti Mäkitalo: Closure Compiler: Umbennenen von Properties von Typen verhindern

Beitrag lesen

Hi,

ich stehe gerade ein wenig auf dem Schlauch und erhoffe mir ein wenig Hilfe.

Ich arbeite mit dem Closure Compiler und versuche, meinen Code mit dem Modus "ADVANCED_OPTIMIZATIONS" zu übersetzen.

Weiterhin kommuniziere ich per AJAX und bekomme von dort JSON zurück. Die Felder des daraus entstehenden JS-Objektes sind natürlicherweise nicht "obfuscated", sondern liegen im Klartext vor.

Nun ersetzt der Compiler die Aufrufe auf Felder des JS-Objekts beim kompilieren durch die Kurzschreibweise. Gibt es eine Möglichkeit, dies zu verhindern?

Mit exportSymbol kann ich m.W. nur erreichen, dass der Name eines Typs o.ä. nicht umbenannt wird, eine Lösung sehe ich darin momentan nicht.

Eine Möglichkeit, welche zwar auch technisch "sauber" ist, sich aber ein wenig unhandlich anfühlt, wäre eine "Übersetzung".

Beim callback würde ich das zu erhaltende Objekt 1:1 in ein lokales Objekt umkopieren, wobei durch den Compiler die Eigenschaften des lokalen Objekts umbenannt werden können.

/** @typedef { { id : number, name : string } } */  
example.MeinLokalerTyp;  
  
goog.net.XhrIo.send(  
  "http://www.example.org/remoteObject/123",  
  function(e) {  
     var xhr = /** @type {goog.net.XhrIo} */ (e.target);  
     var remoteObject = xhr.getResponseJSON();  
     /** @type { example.MeinLokalerTyp} */  
     var localeObject = {  
       id : remoteObject.id,  
       name : remoteObject.name  
     };  
     // further processing ...  
  }  
);

Technisch sauber deshalb, weil (s)ich das Remote-Interface weiterentwickeln könnte, so dass remoteObject und example.MeinLokalerTyp nicht mehr zueinander passen, und ich dies hier abfangen könnte.
Allerdings halte ich dies in Anbetracht der Tatsachen, dass
 (a) der Typedef eh nur ein Minimum beschreibt und ich daher serverseitig beliebige Felder hinzufügen kann sowie
 (b) ich Kontrolle sowohl über Client als auch Server-Interface habe und als wichtigstes
 (c) ich zu faul bin, jedesmal den Code zu schreiben,
für unzweckmäßig.

Wie löst ihr solche Probleme?
Gibt es vielleicht doch eine Möglichkeit, den Compiler zu hindern, alle Vorkommnisse von example.MeinLokalerTyp.* umzubenennen?

Danke für die Hilfe,
Matti