Google AppScript 项目中的 TypeScript 类 顺序

TypeScript classes order in Google AppScript Project

假设我们在 2 个单独的文件中有 2 个简单的 TypeScript classes:

namespace A{
 export abstract class ItemBase {
  id:number=432;
 }
}
///<reference path="B.ts"/>
namespace A{
 export class ItemType extends A.ItemBase{}
}
///<reference path="C.ts"/>
let a:A.ItemType=new A.ItemType();

用clasp推后一切正常

但是如果我将 C.ts 文件的名称更改为 AA.ts,我将得到错误:

TypeError: Cannot read property "prototype" from undefined. (row 14, file „AA”).

如果我不在 Code.ts 中实例化 ItemType class,问题甚至会存在。

似乎 ts2gas 在代码转换过程中没有考虑 extends 关键字并将输出 gs 文件设置为相应的 ts 文件顺序。因此,如果我们将扩展的 class 文件命名为我们正在扩展的 class 文件之前(按字母顺序),我们将得到一个错误。

我是否必须在开发过程中注意 ts 文件名的正确顺序? 我是否必须附加某种机制来处理 gs 文件加载顺序?当 gs 文件已经被转译时,这对我来说似乎是多余的。转译过程 (ts2gas) 应该处理以 TypeScript 方式使用的正确 class 扩展策略。如果 ts2gas 可以使用原型将 TypeScript Class 转换为 JS OOP,为什么它不能正确处理 class 扩展?

我想有一些更简单更好的方法。

您的问题的根本原因之一是 Rhino v1.7R3 JavaScript 引擎,其中 运行s Apps 脚本以及许多 .gs 文件组成一个脚本的方式已提升

此外,ts2gas 库的工作方式(通过独立转译每个源文件)有一些限制,并且可能在您的问题中扮演次要角色。

总而言之,您的脚本实际上是所有 .gs 文件的串联,按照它们在 Google Apps 脚本编辑器中出现的顺序排列。这个顺序通常是每个 .gs 创建的顺序。使用 @google/clasp 将本地文件推送到脚本项目时,此顺序可能会更改为源文件名的字母顺序。

在您的示例中,声明父项 class 的 .gs 必须出现在任何子项声明 classes 之前(即提升问题)

为确保代码的正确排序并避免这种情况,您有多种选择:

  1. 将具有潜在提升问题的代码重新组合到一个文件中(在长 运行 中笨拙和凌乱)
  2. 使用 .clasp.json 中的 filepushorder 选项指定应首先推送哪些文件。 (易于设置和维护)
  3. 有一个不同的项目构建链,以便更好地控制 Typescript 编译和精确的文件顺序(如果需要)。这是 template repository 我已经设置好的开始。

编辑

为了说明 filePushOrder 选项的用法,我使用您的示例代码设置了一个 sample repository