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



我维护了一个数据流库,允许程序员在实例化期间定义新属性,然后在运行时通过属性读取和写入执行整洁的操作,所有这些都透明地归功于 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])
    });

我现在可以编写 map 关键字是透明访问器的代码:

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 关闭SIMPLE_OPTIMIZATION中效果很好,但ADVANCED_COMPILATION警告(并且输出失败(,例如:

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

我已经查看了所有可能适用的注释,但似乎没有什么适合这种动态功能。

我是否错过了一些明显的东西,或者这种动态和优化的组合要求太多了?

使用此方法添加的动态属性需要使用括号访问高级模式:sithApp['obiLoc'] 。在 ADVANCED 模式下,编译器必须知道编译时通过 dot nation 访问的所有属性。

由于不知道这些属性是在类上定义的,因此您将收到类型警告,因此它不应该破坏您的代码。

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

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

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

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

最新更新