首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Google脚本中从业务库中公开业务类

在Google脚本中从业务库中公开业务类
EN

Stack Overflow用户
提问于 2021-06-13 01:47:28
回答 2查看 106关注 0票数 2

因此,我正在开发一个基于MVVM的核心SDK,用于开发一些基于Google脚本的软件,称为OpenSourceSDK。它包含核心业务逻辑,包括要扩展的基类。例如,其中的文件Models/BaseModel.gs被定义为:

代码语言:javascript
复制
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

这是不可接受的。

确保从库中共享这些类(和常量)的最有效方法是什么?

注:本人不接受下列“解决办法”:

  • 每个班的工厂方法。为什么不行?因为:
    • 维修噩梦。假设对类的构造函数签名做了任何更改。您必须在每次更改时更新工厂功能!
    • 额外的样板,包装的东西是如此简单的东西。
    • 如果我们想扩展来自库的基类,会发生什么呢?

  • 以功能为基础。这违背了这个项目的全部目的。我做这个MVVM是有原因的,因此OOP风格。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-14 08:13:37

在ES6 let中,constclass不将自己添加到全局变量中(与varfunction不同)。

我最喜欢的在Apps脚本上导出它们的方法是将所有导出的对象分配给globalThis

代码语言:javascript
复制
class BaseModel { /* [...] */ }
class AnotherType { /* [...] */ }
const ExampleConstant = 420

Object.assign(globalThis, {
  BaseModel,
  AnotherType,
  ExampleConstant,
})

这允许您选择要“导出”的内容,并遵循一个足够好的语法。

更新

您还可以使用以下函数模拟单个导出语法:

代码语言:javascript
复制
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
}

你就这样用它:

代码语言:javascript
复制
export_ (class Example {
  // [...]
})

不幸的是,最后的下划线是必要的,以避免与关键字冲突,括号不是我的茶(特别是在结尾的)。但我同意这将是更可维护的,因为您不需要手动更新列表。

参考文献

票数 3
EN

Stack Overflow用户

发布于 2021-06-13 22:53:57

我能够解决它,但解决方案is...hacky。

因此,很明显,Google脚本只导出一个项目的globalThis中的内容:只有functionvariable。没有classes没有const蚂蚁..。

可能与ES6的工作方式以及它的globalThis行为有很大关系。通过在本地开发人员控制台中创建一个虚拟function、一个虚拟variable和一个虚拟class,人们可以看到这一点:

代码语言:javascript
复制
function aFunction() { return 42; }
class AClass {}
var a = 41;

当他们记录globalThis时,他们会发现一些巨大的对象,里面有aaFunction,但没有class

而且,事实证明globalThis是不可变的,所以你不能通过某些生命黑进class .

唯一的办法是在每个要公开的var [ClassName] =前面抢占var [ClassName] =。这将将[ClassName]分配给公开公开的var

我等不及谷歌应用程序脚本想出一个更好的方法来公开类!!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67954208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档