我们有一个包含一些TypeScript文件的Visual Studio 2017项目。在一些地方,我们有一个URLs
类,其实现方式各不相同,因此我们可以根据我们提取的文件更改网站网址,例如:
customer / urls.ts
namespace Portal {
export class URLs {
static homePage(): string { return "/customer"; }
}
}
supplier / urls.ts
namespace Portal {
export class URLs {
static homePage(): string { return "/supplier"; }
}
}
但是,这会导致Visual Studio 2017提供错误“重复标识符'URL'”。 VS似乎假设所有TypeScript文件都会被拉入网页,但由于任何给定页面中只有其中一个会被拉入,因此浏览器中实际上不会有重复的标识符。如何阻止VS发出此错误(或者实际上有充分的理由)?
答案 0 :(得分:0)
这是由于两件事的结合:
Typescript中的命名空间(也称为"内部模块"),根据定义,污染全局命名空间。当文件以非导出的名称空间声明开头时,意味着标识符将在全局范围内可用。这与模块(也称为"外部模块")形成对比,必须明确导入和导出。有关详细说明,请参阅this comment。
除非您明确包含或排除tsconfig.json
中的特定文件,否则将包含Portal.URLs
的两个定义。来自tsconfig.json
documentation:
如果"文件"和"包括"两者都未指定,编译器 默认包括所有TypeScript(.ts,.d.ts和.tsx)文件 包含目录和子目录,但排除的除外 使用"排除"属性。
因此,编译器尝试将相同的声明添加到全局命名空间两次,导致重复的标识符错误。
正确的修复取决于您如何使用此类以及如何决定使用哪种实现。
一个修复方法是完全避免名称空间。例如,您可以定义URLs
接口,在需要的地方导入,然后根据某些环境变量或构建配置使用CustomerURLs
实现或SupplierURLs
实现。
另一种选择是创建基础tsconfig.json
,然后使用extends
为每个配置创建单独的tsconfig.customer.json
,tsconfig.supplier.json
等文件。在每一个中,除了您关心的那个之外,您将排除所有**/urls.ts
。然而,这不是特别可扩展的,我不确定VS如何从智能感知角度处理它。