Как можно использовать расширенную компиляцию Google Closure с классами ES6 и произвольным defineProperty? - PullRequest
0 голосов
/ 29 апреля 2018

Я поддерживаю библиотеку потоков данных, которая позволяет программистам определять новые свойства во время создания экземпляров, а затем делает аккуратные вещи во время выполнения с чтением и записью свойств, все прозрачно благодаря JS defineProperty. Пример использования, где TagSession определяется с помощью ключевого слова ES6 class:

const sithApp = new TagSession( null, 'SithTrakSession',
    {
        obiTrakker: cF( c => new WebSocket('ws://localhost:4000')
            .onmessage = msg => c.md.obiLoc = JSON.parse(msg.data)),
        obiLoc: cI( null),
        sithIds: cI([-1,-2,3616,-3,-4])
    });

Теперь я могу написать код, в котором ключевые слова карты являются прозрачными средствами доступа:

function SithTrak () {
    return div({class: "app-container"},
        h1({
            class: "css-planet-monitor",
            content: cF(c => "Obi-Wan currently on " +
                (sithApp.obiLoc ?
                    sithApp.obiLoc.name : "...dunno"))
        }))
}

Это прекрасно работает без компиляции и с Google Closure SIMPLE_OPTIMIZATION, но ADVANCED_COMPILATION предупреждает (и вывод не удается), например:

WARNING - Property obiLoc never defined on TagSession
            withObi: cF( c=> c.md.info && sithApp.obiLoc

Я рассмотрел все аннотации, которые могут применяться, но, похоже, ничто не подходит для такой динамической возможности.

Я что-то упускаю из виду или это сочетание динамизма и оптимизации требует слишком много?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Поскольку неизвестно, что эти свойства определены для класса, который вы собираетесь получать предупреждения о типах, бит не должен нарушать ваш код.

Вы можете добавить объявления, чтобы заставить замолчать предупреждения типа:

/** @type {?} */ TagSession.prototype.objLoc;

В других случаях вы можете использовать @lends, но я не думаю, что это сработает, поскольку предоставленные типы могут не соответствовать ожидаемому типу значения свойства. Но недостаточно контекста, чтобы быть уверенным:

/** @lends {TagSession.prototype} */ ({ obiTrakker: ..., obiLoc: ..., sithIds: ... })

0 голосов
/ 04 мая 2018

Динамические свойства, добавленные с помощью этого метода, потребуют использования доступа в скобках для режима ADVANCED: sithApp['obiLoc']. В режиме ADVANCED компилятор должен знать обо всех свойствах, доступных через точку нации во время компиляции.

...