【问题标题】:How to import all modules from a directory in TypeScript?如何从 TypeScript 的目录中导入所有模块?
【发布时间】:2017-04-03 19:48:22
【问题描述】:

在 TypeScript handbook 中描述了一些导入模块的技术:

  • 从模块导入单个导出:import { ZipCodeValidator } from "./ZipCodeValidator";
  • 从模块导入单个导出并重命名:import { ZipCodeValidator as ZCV } from "./ZipCodeValidator";
  • 导入整个模块:import * as validator from "./ZipCodeValidator";

我希望还有一个选择,但我找不到它。是否可以从给定目录导入所有模块?

我猜语法应该差不多是这样的:import * from "./Converters"

【问题讨论】:

标签: typescript


【解决方案1】:

我不确定生产代码是否安全,但我使用以下内容在目录中导入测试代码

import glob from 'glob'

new Promise((resolve, reject) => {
  glob(__dirname + '/**/*.ts', function (err, res) {
    if (err) {
      reject(err)
    } else {
      Promise.all(
        res.map(file => {
          return import(file.replace(__dirname, '.').replace('.ts', ''))
        })
      ).then(modules => {
        resolve(modules)
      })
    }
  })
}).then(modules => {
  // do stuff
})

【讨论】:

  • 应该被接受回答恕我直言。谢谢你
【解决方案2】:

不,这是不可能的。大多数人所做的是创建一个index.js 文件,该文件重新导出同一目录中的所有文件。

例子:

my-module/
  a.ts
  b.ts
  index.ts

a.ts

export default function hello() {
  console.log("hello");
}

b.ts

export default function world() {
  console.log("world");
}

index.ts

export { default as A } from "./a";
export { default as B } from "./b";

您可以使用* 字符重新导出模块的每个导出,并使用一行。请注意,如果已通过 导出具有相同名称的成员,TypeScript 将出错(感谢@haysclark 的提示)

export * from "./somePath";

可以删除索引名称(与 javascript 相同):

import * as whatever from "./my-module";

console.log(whatever);
// Logs: { A: [Function: hello], B: [Function: world] }

【讨论】:

  • 如果所有添加的文件都在 index.ts 中导出,如何编写测试用例?比如如果一个 d.ts 并且没有添加到 index.ts 如何以编程方式避免这种情况
  • @Raghavendra 因为一切都是object,所以可以简单地遍历键。比如:import * as foo from "./bar"; console.log(Object.keys(foo).length) // logs import count
  • 这不是我要问的,以上面的答案为例,我想编写测试来检查他们是否在 index.ts 文件中添加了所有 a.ts、b.ts ?
  • 我明白了。我不知道有任何可靠的解决方案可以比较出口。可以编写一个函数来全局化目录并将它们与导出的函数进行比较,但这总是有些脆弱,特别是因为您可以以不同的名称导出内容。如果您和您的团队在命名方面有足够的纪律,那么我之前评论中的解决方案就是这样做的。
  • @marvinhagemeister export * from "./somePath"; 可能值得添加到您的答案中。 :D
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2019-05-31
  • 2020-03-02
  • 2019-11-10
相关资源
最近更新 更多