gpt4 book ai didi

typescript - 将 Typescript 与 Google Apps 脚本结合使用

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:20 27 4
gpt4 key购买 nike

我想为我的 Google Apps 脚本 (GAS) 项目使用 Typescript,但我找不到将我的代码编译成 GAS 接受的东西的方法。

GAS 不支持导出,并且 Typescript 似乎不喜欢通过全局范围访问变量(它需要导入/要求,因此需要导出)。

我正在寻找以下任何一种我认为对我有用的解决方案:

1) Babel 插件等可以删除所有 Import 和 Export 语句及其属性名称(要求我不使用相同的方法名称,我不这样做。

所以:

import MyLibrary from './library';
export function greetJohn() { MyLibrary.greet('John'); }
export default { greetJohn }

变成:

function greetJohn() { greet('John'); }

2) 修改 typescript 使其可以看到全局范围

3) Babel 插件或类似的插件,将所有的 .ts 文件组合成一个 .js 文件,并通过将每个文件视为一个对象/函数来转换导入/导出语句。

最佳答案

背景

自从您写下这个问题后,情况发生了变化,现在对 TypeScript 的 AppsScript 开发有了更好的支持。正如 Aliabbas Merchant 所说,将 TS 编译为 GAS 的最佳方法是使用 clasp ,这是一个用于开发 AppsScript 应用程序的 CLI 工具。表扣使用ts2gas引擎盖下的库将 TS 转换为 GAS,因此不再需要 Webpack 或任何其他仅用于将代码转换为 AppsScript 的 bundler 。

Aliabbas Merchant 没有提到的是 ts2gas不(还!)支持 export 语法,这会在开发时导致 linter 错误,并且不会被 IDE 很好地接受(即使禁用 linter,IDE 也不会识别导入的变量并且不会将它们视为对导出的引用......)

问题

问题源于以下事实:AppsScript 不使用模块系统,并且每个定义的顶级 var 也可以从其他文件访问(与将文件“包装”为模块的 TS 相比)。当前版本的 ts2gas 的问题在于它转译了以下语句:

export var x = 5;

进入:

exports.x = 5

因此,在 clasp 将 .ts 转换为 .gs 之后,当 .gs 的另一个文件尝试访问导出的 var 时,它不会找到它。实际上,这个变量并没有像预期的那样存储为全局变量,而是在 exports 对象(它本身就是一个全局变量)中。如果我们能以某种方式“欺骗”编译器,那么它既能将 var 保存在全局环境中,即使它也被导出(这样我们就可以毫无错误地使用 TS),我们就赢了。

解决方案

所以我们正在寻找解决方法。您可以使用 TS 文档 ( https://github.com/google/clasp/blob/master/docs/typescript.md ) 在 clasp 中找到一些,但还有一个我发现最简单的技巧:

在本地定义变量(不导出它),然后导出一个包含我们要导出的所有变量(当然也可以是函数)的对象。 TS 将表现为定期导出变量(它是用于导出变量的语法糖),但编译器会将变量保存在全局变量和导出对象中。

示例

const a = 5;

function b() {
return 'Hello World';
}

export {
a,
b
}

这样,变量就真正导出了,可以像往常一样在 TS 中使用,但在编译为 GAS 文件后也会留在全局环境中(编译器实际上会将它们添加到 export对象,但我们不应该关心它)。

关于typescript - 将 Typescript 与 Google Apps 脚本结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48791868/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com