我维护了一个数据流库,允许程序员在实例化期间定义新属性,然后在运行时使用属性读取和写入来做整齐的事情,所有这些都透明地归功于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
我查看了可能适用的所有注释,但似乎没有什么适合这种动态功能。
我是否遗漏了一些明显的东西,或者这种动态和优化的组合要求太多了?
答案 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: ...
})