TypeScript ES6命名空间

3
我最近将一个Node.js项目从ECMAScript 6兼容的JavaScript转换为TypeScript。我仍然不完全熟悉TypeScript和ES6之间的交互,特别是在命名空间和类型方面。
在我的项目中有一个名为“sql”的子文件夹,它导出了许多与该项目的MySQL数据库交互的函数。我想在一个“Sql.Models”命名空间中组织我的DB模型类型,这样它们就可以被引用,例如“Sql.Models.User”。我希望我的模型在一个或多个“.d.ts”文件中声明在“sql”文件夹内,但我无法弄清楚如何正确组织这些内容,以便在其他地方可以引用这些类型。显然,我不能require或import一个“.d.ts”文件;那不是一个有效的TypeScript操作。我该如何在另一个ES6兼容的TypeScript模块中使用在“.d.ts”文件中声明的类型“Sql.Models.User”?
2个回答

0

我用“别名内部导入”解决了这个问题,虽然听起来有点奇怪,但实际上并不是。我将一个别名导出到一个内部符号,这个符号恰好是从另一个文件中导入的。

source code

我更喜欢像C#那样的方式,可以在两个文件中定义命名空间,并以某种方式将一个文件别名为另一个文件,以便只需要引用一个文件,但是这似乎在ECMAScript 6兼容的TypeScript中不可能实现。


0
如何在另一个符合ES6标准的TypeScript模块中使用在.d.ts文件中声明的Sql.Models.User类型?
下面这个非常简单的设置可以工作。
root
  sql
    models.d.ts
  index.ts
  tsconfig.json 

model.d.ts文件声明了一个命名空间和一个类型。正如图像所示,index.ts文件可以将该命名空间别名或直接访问它。

enter image description here

以上是使用TypeScript版本2.2.1。


当我像这样设置时,我无法从具有根级命名空间Sql的另一个文件中访问Sql.Models。也许我太过于考虑C#的工作方式,即多个文件可以参与命名空间。我希望一个类提供Sql命名空间,并且是项目中其他文件需要要求的唯一文件。它将定义一些常见函数,例如query。但我还想提供其他命名空间,例如上面描述的模型,所有这些都是Sql命名空间的子节点。 - Arcanox
我理解你想要一个名为 Sql 的命名空间和另一个子命名空间名为 Sql.Models,是这样吗? - Shaun Luttin
没错。我想我通过在 sql.ts 旁边放置一个 models.ts 文件来导出模型接口,然后在 sql.ts 中导入它们,并在该文件中将它们重新导出到其正确的命名空间内(import * as models from "./models",然后稍后 export namespace Sql { export namespace Models { export type User = models.User; } })。虽然不太美观,但它可以实现我想要的最终结果。 - Arcanox
似乎你已经回答了自己的问题。 - Shaun Luttin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接