【问题标题】:TypeScript ES6 namespacesTypeScript ES6 命名空间
【发布时间】:2017-07-25 00:26:25
【问题描述】:

我有一个 Node.js 项目,我最近从兼容 ECMAScript 6 的 JavaScript 转换为 TypeScript。我仍然不完全熟悉 TypeScript 和 ES6 的交互方式,尤其是在命名空间和类型方面。

我的项目中有一个名为sql 的子文件夹,听起来,它导出了许多函数来与项目的 MySQL 数据库进行交互。我想在Sql.Models 命名空间中组织我的数据库模型类型,以便可以引用它们,例如Sql.Models.User。我希望我的模型在sql 文件夹内的一个或多个.d.ts 文件中声明,但我不知道如何正确组织它以便可以在其他地方引用这些类型。我显然不能requireimport .d.ts 文件;这不是一个有效的 TypeScript 操作。如何在另一个兼容 ES6 的 TypeScript 模块中使用 .d.ts 文件中声明的类型 Sql.Models.User

【问题讨论】:

    标签: node.js typescript ecmascript-6


    【解决方案1】:

    我通过使用“别名内部导入”以一种不太漂亮的方式解决了这个问题,这听起来很奇怪,但实际上并非如此。我将别名导出到一个内部符号,它恰好是从另一个文件导入的符号。

    我更喜欢 C# 的工作方式,我可以在两个文件中定义名称空间,并以某种方式将一个文件与另一个文件命名,这样只需要引用一个文件,但这似乎不适用于兼容 ECMAScript 6 的文件打字稿。

    【讨论】:

      【解决方案2】:

      如何在另一个兼容 ES6 的 TypeScript 模块中使用 .d.ts 文件中声明的类型 Sql.Models.User?

      以下非常简单的设置有效。

      root
        sql
          models.d.ts
        index.ts
        tsconfig.json 
      

      model.d.ts 文件声明了命名空间和类型。如图所示,index.ts 文件可以为该命名空间设置别名和/或直接访问它。

      以上使用的是TypeScript 2.2.1版本。

      【讨论】:

      • 当我这样设置时,我无法从另一个具有根级命名空间Sql 的文件访问Sql.Models。也许我在 C# 的工作方式方面想得太多,多个文件可以参与一个命名空间。我想让一个类提供Sql 命名空间,并成为我项目中其他人需要的唯一文件。它将定义一些常用函数,例如query。但我也希望提供其他命名空间,例如,如上所述的模型,它们都是 Sql 命名空间的子代。
      • 我是否理解您想要一个名为 Sql 的命名空间和另一个名为 Sql.Models 的子命名空间?
      • 没错。我想我设法通过在sql.ts 旁边有一个导出模型接口的models.ts 文件来解决这个问题,然后将它们导入sql.ts 并将它们重新导出到该文件的适当命名空间中(import * as models from "./models" 和然后稍后export namespace Sql { export namespace Models { export type User = models.User; } }。它不像我想要的那样漂亮,但它可以工作并产生我想要的最终结果。
      • 您似乎已经回答了自己的问题。
      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 2018-01-05
      • 2015-12-21
      • 2016-05-17
      • 2018-07-24
      • 2016-09-28
      • 2012-09-26
      • 2023-03-13
      相关资源
      最近更新 更多