Измените, как компилятор Closure называет приватных членов - PullRequest
0 голосов
/ 14 декабря 2018

Я работаю с большой библиотекой JS, которая минимизирована с помощью ADVANCED_OPTIMIZATIONS, и я пытаюсь изменить способ переименования членов.

Вот что я имею в качестве ввода:

/**
 * This is my class
 * @constructor
 * @param {string} name
 * */
function MyClass(name) {
    /**
     * I want this public member to stay the same in the output since it will be exported
     * @expose
     * */
    this.exposedMember = name;
    /**
     * But this member is meant to only be used by this class
     * @private
     * */
    this.privateMember = "private";
}
var myObj = new MyClass("Jack");
myObj.exposedMember;    // => "Jack"
myObj.privateMember;    // => "private"

Вот что я получаю в качестве вывода:

var myObj = new MyClass("Jack");
myObj.exposedMember;    // => "Jack"
myObj.Rc;               // => "private"

Вот что я хочу в качестве вывода:

var myObj = new MyClass("Jack");
myObj.exposedMember;    // => "Jack"
myObj._Rc;              // => "private"

Причинаявляется то, что я также работаю с Google Maps JS API, и у меня было несколько случаев, когда мои частные участники сталкивались с их из одной версии в другую.Наличие контроля над моими личными членами, где я могу выбрать префикс их с _ (или $, или как угодно), устранит проблему.

Есть ли в командной строке что-то, что может помочь мне сделатьэтот?Если нет, есть ли плагин для Closure Compiler, который может это сделать?Что-то еще?

Спасибо

1 Ответ

0 голосов
/ 15 декабря 2018

Параметры для прямого переименования этого типа не отображаются через флаги командной строки.Это потребует пользовательской сборки компилятора.

В общем, всегда опасно добавлять свойства к внешним объектам, если их полное определение не известно.Google Maps API особенно сложен в этом отношении.

Единственный безопасный способ сделать это - определить пользовательский extern для расширяемых объектов Maps:

extern:

/** @const */ google.maps.Marker.prototype.data = {};

source:

const myMarker = new google.maps.Marker();
myMarker.data.mySafeProperty = 'foo';

Однако это нарушает истинное расширение класса.Это никогда не безопасно, не зная полной подписи типа.

...