如何推进谷歌闭包编译与ES6类和任意defineProperty一起使用?

时间:2018-04-29 19:51:30

标签: google-closure-compiler

我维护了一个数据流库,允许程序员在实例化期间定义新属性,然后在运行时使用属性读取和写入来做整齐的事情,所有这些都透明地归功于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 :(得分:0)

使用此方法添加的动态属性需要使用括号访问权限进行ADVANCED模式:"client_secret" : "90ec9638-7647-4e65-ad20-b82df3341084", "username" : "ankur", "password" : "123456", "grant_type" : "password", "client_id": "app-client" 。在ADVANCED模式下,编译器必须知道在编译时通过点国家访问的所有属性。

答案 1 :(得分:0)

由于不知道这些属性是在类中定义的,因此您将获得类型警告,因此它不会破坏您的代码。

您可以添加声明以使类型警告静音:

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

在其他情况下,您可能可以使用@lends,但我认为这在这里不起作用,因为提供的类型可能与属性值的预期类型不匹配。但是没有足够的上下文可以确定:

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