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