因此,我正在开发一个基于MVVM的核心SDK,用于开发一些基于Google脚本的软件,称为OpenSourceSDK。它包含核心业务逻辑,包括要扩展的基类。例如,其中的文件Models/BaseModel.gs被定义为:
class BaseModel {
static FromObject(obj) {
let model = new this()
return model.unmarshal(obj)
}
/**
* Creates a deep-copy of this, as plain Object
*/
marshal() {
return JSON.parse(JSON.stringify(this));
}
/**
* Writes the target object into this and returns this
* @param {*} obj
*/
unmarshal(obj) {
return Object.assign(this, obj);
}
}我使用按照指示执行来创建这个库,并确保将它导入到使用它的项目中。当我尝试使用它时,事情就会偏离方向:我能够访问函数,但不能访问类或常量!!我开始输入OpenSourceSDK.BaseModel,而IntelliSense就像"idk该做什么“。我通过Logger.log(typeof OpenSourceSDK.BaseModel)进行了理智测试,结果得到了undefined。
这是不可接受的。
确保从库中共享这些类(和常量)的最有效方法是什么?
注:本人不接受下列“解决办法”:
发布于 2021-06-14 08:13:37
在ES6 let中,const和class不将自己添加到全局变量中(与var和function不同)。
我最喜欢的在Apps脚本上导出它们的方法是将所有导出的对象分配给globalThis
class BaseModel { /* [...] */ }
class AnotherType { /* [...] */ }
const ExampleConstant = 420
Object.assign(globalThis, {
BaseModel,
AnotherType,
ExampleConstant,
})这允许您选择要“导出”的内容,并遵循一个足够好的语法。
更新
您还可以使用以下函数模拟单个导出语法:
function export_(exported) {
const { name } = exported
if (!name)
throw new Error(`To export a function or a class, it needs to have a name.`)
if (name in globalThis)
throw new Error(`A feature with the same name already exists on globalThis.`)
globalThis[name] = exported
return exported
}你就这样用它:
export_ (class Example {
// [...]
})不幸的是,最后的下划线是必要的,以避免与关键字冲突,括号不是我的茶(特别是在结尾的)。但我同意这将是更可维护的,因为您不需要手动更新列表。
参考文献
发布于 2021-06-13 22:53:57
我能够解决它,但解决方案is...hacky。
因此,很明显,Google脚本只导出一个项目的globalThis中的内容:只有function和variable。没有classes没有const蚂蚁..。
可能与ES6的工作方式以及它的globalThis行为有很大关系。通过在本地开发人员控制台中创建一个虚拟function、一个虚拟variable和一个虚拟class,人们可以看到这一点:
function aFunction() { return 42; }
class AClass {}
var a = 41;当他们记录globalThis时,他们会发现一些巨大的对象,里面有a,aFunction,但没有class

而且,事实证明globalThis是不可变的,所以你不能通过某些生命黑进class .
唯一的办法是在每个要公开的var [ClassName] =前面抢占var [ClassName] =。这将将[ClassName]分配给公开公开的var。
我等不及谷歌应用程序脚本想出一个更好的方法来公开类!!
https://stackoverflow.com/questions/67954208
复制相似问题