背景
自从你写了这个问题后,情况发生了变化,现在对 TypeScript 的 AppsScript 开发有更好的支持。正如 Aliabbas Merchant 所说,将 TS 编译为 GAS 的最佳方法是使用clasp,这是一个用于开发 AppsScript 应用程序的 CLI 工具。Clasp 在后台使用ts2gas库将 TS 转换为 GAS,因此不再需要 Webpack 或任何其他捆绑器来将代码转换为 AppsScript。
Aliabbas Merchant 没有提到的是ts2gas不(还!)支持export
语法,这会在开发时导致 linter 错误,并且不会被 IDE 很好地接受(即使禁用 linter,IDE 也不会识别导入的变量,并且不会将它们视为对导出的引用...)
问题
问题始于 AppsScript 不使用模块系统,并且定义的每个顶级 var 也可以从其他文件访问(与将文件“包装”为模块的 TS 形成对比)。当前版本的 ts2gas 的问题在于它转译了以下语句:
export var x = 5;
进入:
exports.x = 5
因此,在 clasp 转换.ts
为之后.gs
,当另一个文件.gs
尝试访问导出的 var 时,它找不到它。实际上,这个 var 并没有像预期的那样存储为全局 var,而是在exports
对象内部(它本身就是一个全局 var)。如果我们可以以某种方式“欺骗”编译器,那么它既可以将 var 保留在全局环境中,即使它也被导出(因此我们可以使用 TS 而不会出现错误),我们会赢。
解决方案
所以我们正在寻找一种解决方法。您可以使用 TS 文档(https://github.com/google/clasp/blob/master/docs/typescript.md)在 clasp 中找到一些技巧,但我发现还有一个最简单的技巧:
在本地定义 var(不导出它),然后导出一个包含我们想要导出的所有 var(当然也可以是函数)的对象。TS 将表现为定期导出 var(它是导出 var 的语法糖),但编译器会将 var 保持在全局和导出对象内。
例子
const a = 5;
function b() {
return 'Hello World';
}
export {
a,
b
}
这样,vars 被真正导出并可以像往常一样在 TS 中使用,但在编译为 GAS 文件后也会留在全局环境中(编译器实际上会将它们添加到export
对象中,但我们不应该关心它) .