如何从TypeScript中的目录导入所有模块?

Lan*_*eyo 25 typescript

在TypeScript 手册中,描述了几种导入模块的技术:

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

我希望还有一个选择,但我无处可寻.是否可以从给定目录导入所有模块?

我想语法应该或多或少像这样:import * from "./Converters".

mar*_*ter 37

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

例:

my-module/
  a.ts
  b.ts
  index.ts
Run Code Online (Sandbox Code Playgroud)

a.ts

export default function hello() {
  console.log("hello");
}
Run Code Online (Sandbox Code Playgroud)

b.ts

export default function world() {
  console.log("world");
}
Run Code Online (Sandbox Code Playgroud)

index.ts

export { default as A } from "./a";
export { default as B } from "./b";
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这不是我要问的以上面的答案为例我想编写测试来检查他们是否在index.ts文件中添加了所有a.ts,b.ts? (2认同)

Tom*_*ard 24

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

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
})
Run Code Online (Sandbox Code Playgroud)


小智 8

这是 @tom-howard 使用 ES2022 语法的答案。

import glob from 'glob';

let modules;

try {
  const res = await glob(__dirname + '/**/*.ts');
  modules = Promise.all(res.map((file) => (
    import(file.replace(__dirname, '.').replace('.ts', ''))
  )));
} catch (err) {
  // handle `err`
}

// use `modules`
Run Code Online (Sandbox Code Playgroud)