我想在我的Google Apps脚本(GAS)项目中使用Typescript,但我找不到将代码编译成GAS接受的内容的方法。
GAS不支持导出,而且Typescript似乎不喜欢通过全局范围访问变量(它需要import / require,因此导出)。
我正在寻找以下任何一种解决方案,我相信这些解决方案会让我的工作变得有用:
1)可以删除所有导入和导出语句及其属性名称的Babel插件等(要求我不使用相同的方法名称,我不这样做。
所以:
import MyLibrary from './library';
export function greetJohn() { MyLibrary.greet('John'); }
export default { greetJohn }
变为:
function greetJohn() { greet('John'); }
2)更改打字稿,以便它可以看到全局范围
3)将所有.ts文件合并到一个.js文件中的Babel插件或类似物,并通过将每个文件视为对象/函数来转换导入/导出语句。
答案 0 :(得分:3)
背景
自您撰写此问题以来,情况已经发生变化,如今,TypeScript已为AppsScript开发提供了更好的支持。 就像Aliabbas Merchant所说的那样,将TS编译为GAS的最佳方法是使用clasp,它是用于开发AppsScript应用程序的CLI工具。 Clasp在后台使用ts2gas库将TS转换为GAS,因此不再需要Webpack或任何其他捆绑程序将代码转换为AppsScript。
Aliabbas Merchant没有提到的是ts2gas不(还!)支持export
语法,这在开发时会导致linter错误,并且不会被IDE很好地接受(即使禁用了linter,IDE也不会识别导入的var,也不会将其视为对导出的引用...)
问题
问题源于以下事实:AppsScript不使用模块系统,并且还可以从其他文件访问定义的每个顶级var(与将“ wrapps”文件作为模块的TS相比)。 当前版本的ts2gas的问题在于它会转换以下语句:
export var x = 5;
进入:
exports.x = 5
因此,在clasp将.ts
转换为.gs
之后,当.gs
的另一个文件尝试访问导出的var时,找不到它。实际上,此var不会像预期的那样存储为全局var,而是存储在exports
对象(本身就是全局var)中。如果我们能够以某种方式“欺骗”编译器,那么即使将var也导出,它都将var保留在全局环境中(这样我们就可以毫无错误地使用TS),我们会赢。
解决方案
因此,我们正在寻找解决方法。您可以使用TS文档(https://github.com/google/clasp/blob/master/docs/typescript.md)在扣环中找到一些东西,但是我发现了另一个最简单的技巧:
在本地定义var(不导出它),然后在导出带有所有var(当然也可以是函数)的对象时,我们要导出。 TS的行为就像定期导出vars( 一种用于导出var的语法糖),但编译器会将var保留在全局对象和导出对象内部。
示例
const a = 5;
function b() {
return 'Hello World';
}
export {
a,
b
}
通过这种方式,可以真正导出var,并且可以照常在TS中使用它们,但是在编译为GAS文件后,它们也将保留在全局环境中(编译器实际上会将它们添加到export
对象中,但是我们不应该在意)。
答案 1 :(得分:2)
过去几周我一直在研究类似的情况(不使用TypeScript,但仍使用ES6 / ES7)。
我发现的一些事情可能会对您尝试实现的目标有所帮助:
import * as x from y
语法工作,import { x } from y
和import x from y
在使用网络包时工作正常。如果您不想使用webpack,一种解决方案是将所有代码放在一个app.ts
文件中,创建一个包含所有功能的对象,将功能设置为顶级所以他们可以被GAS接收。您还可以导出容器对象并在测试套件中使用它。使用Babel进行编译时,请使用babel-plugin-transform-remove-export插件删除导出语句。
const app = {
onInstall: () => { ...
},
onOpen: () => { ...
}
}
const { onOpen, onInstall } = app;
export { app };
答案 2 :(得分:1)
现在可以使用Typescript来开发Google Apps脚本项目,但这不能直接在Apps脚本编辑器上完成。
根据Develop Apps Script using TypeScript,更简单的方法是使用clasp。
相关
答案 3 :(得分:1)
使用TypeScript with Google App Script的最佳(推荐)方法是使用clasp。
npm install @google/clasp -g
clasp login
clasp create [scriptTitle]
appsscripts.json
文件中的时区更改为this list中最合适的时区。npm i -S @types/google-apps-script
{
"compilerOptions": {
"lib": [
"esnext"
],
"experimentalDecorators": true
}
}
clasp push
注意:您不需要使用import
和export
。可以跨文件访问变量。