如何不导入与TypeScript同名的类型/接口/类



我过去有一个简单的文件结构,在一个文件夹中有5个文件:

  • classes.ts
  • 你好.ts
  • 类型.ts
  • 函数.ts
  • tsconfig.json

tsconfig.json:


{
"compilerOptions": {
"module": "commonjs",
"target": "es2015",
"sourceMap": false,
"strict": true,
"strictPropertyInitialization": false
},
"files": [
"classes.ts",
"hello.ts",
"functions.ts",
"types.ts"
],
"exclude": [
"node_modules"
]
}

然而,随着时间的推移,我开始出现类型/接口/类名冲突。问题是:我如何防止classes.ts从hello.ts了解特定类型(或所有类型(?它们似乎是隐含地导入的,这对我来说不是想要的行为

我试着用每个文件夹不同的tsconfig.json将它们分离到不同的文件夹中,但.ts文件并不是一次编译完的,而是一个文件夹一个文件夹地编译。

TypeScript区分两种类型的文件:

  • 模块,可能是CommonJS或ES方言
  • 脚本,不使用";import""出口"module.exports";,或任何其他模块机制,因此脚本中定义的所有内容都进入全局命名空间

As在";模块";手册文档,强调矿:

在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级importexport的文件都被视为模块。

相反,没有任何顶级导入或导出声明的文件被视为其内容在全局范围内可用的脚本(因此也可用于模块(。

尽管您使用了术语";导入类型";,您在注释中澄清了这些是脚本,因此这些类型不会像在模块中那样导入:全局命名空间中定义的所有内容都可以访问全局命名空间中其他定义的内容。正如本手册中提倡命名空间的参考示例一样,emphasis mine:

随着我们添加更多的验证器,我们将希望有某种组织方案,这样我们就可以跟踪我们的类型,而不用担心与其他对象的名称冲突与其将许多不同的名称放入全局名称空间,不如将对象封装到一个名称空间中

该手册参考页提出了一个解决方案,即使用namespace关键字为潜在冲突提供更具体的名称;然后可以使用别名来缩短要键入的名称的长度。然而,您也可以考虑使用显式模块,这些模块的设计考虑到了模块化和名称冲突避免。

最新更新