VS2017 TypeScript错误:重复标识符'URL'

时间:2018-04-03 08:39:40

标签: typescript visual-studio-2017

我们有一个包含一些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发出此错误(或者实际上有充分的理由)?

1 个答案:

答案 0 :(得分:0)

这是由于两件事的结合:

  1. Typescript中的命名空间(也称为"内部模块"),根据定义,污染全局命名空间。当文件以非导出的名称空间声明开头时,意味着标识符将在全局范围内可用。这与模块(也称为"外部模块")形成对比,必须明确导入和导出。有关详细说明,请参阅this comment

  2. 除非您明确包含或排除tsconfig.json中的特定文件,否则将包含Portal.URLs的两个定义。来自tsconfig.json documentation

  3.   

    如果"文件"和"包括"两者都未指定,编译器   默认包括所有TypeScript(.ts,.d.ts和.tsx)文件   包含目录和子目录,但排除的除外   使用"排除"属性。

    因此,编译器尝试将相同的声明添加到全局命名空间两次,导致重复的标识符错误。

    正确的修复取决于您如何使用此类以及如何决定使用哪种实现。

    一个修复方法是完全避免名称空间。例如,您可以定义URLs接口,在需要的地方导入,然后根据某些环境变量或构建配置使用CustomerURLs实现或SupplierURLs实现。

    另一种选择是创建基础tsconfig.json,然后使用extends为每个配置创建单独的tsconfig.customer.jsontsconfig.supplier.json等文件。在每一个中,除了您关心的那个之外,您将排除所有**/urls.ts。然而,这不是特别可扩展的,我不确定VS如何从智能感知角度处理它。