【问题标题】:VS2017 TypeScript error: Duplicate identifier 'URLs'VS2017 TypeScript 错误:重复的标识符“URL”
【发布时间】:2018-04-03 23:57:05
【问题描述】:

我们有一个包含一些 TypeScript 文件的 Visual Studio 2017 项目。在几个地方,我们有一个 URLs 类,它的实现会有所不同,因此我们可以根据我们拉入的文件来更改站点 URL,例如:

客户/urls.ts

namespace Portal {
    export class URLs {
        static homePage(): string { return "/customer"; }
    }
}

供应商/urls.ts

namespace Portal {
    export class URLs {
        static homePage(): string { return "/supplier"; }
    }
}

但是,这会导致 Visual Studio 2017 给出错误“重复标识符 'URLs'”。 VS 似乎假设所有 TypeScript 文件都将被拉入网页,但由于任何给定页面只会拉入其中一个文件,因此浏览器中实际上不会有重复的标识符。我怎样才能阻止 VS 给出这个错误(或者实际上有很好的理由)?

【问题讨论】:

    标签: typescript visual-studio-2017


    【解决方案1】:

    这是由于两件事的结合:

    1. Typescript 中的命名空间(也称为“内部模块”)根据定义会污染全局命名空间。当文件以非导出的命名空间声明开头时,这意味着该标识符将在全球范围内可用。这与必须显式导入和导出的模块(也称为“外部模块”)形成对比。请参阅this comment 以获得很好的解释。

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

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

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

    正确的解决方法取决于您如何使用此类以及如何决定使用哪个实现。

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

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

    【讨论】:

    • 它抱怨的是 URLs 类被导出,而不是 Portal 命名空间。
    • namespace Portal 开头的文件意味着1) 全局命名空间Portal 将存在,2) 文件中的每个导出成员都将位于该全局命名空间中。所以在这种情况下,export class URLs 的意思是“使URLsPortal.URLs 下全局可用”,而不是“使URLs 在另一个文件中可导入”(这是模块导出所做的)。与直觉相反,如果你导出 namespace (export namespace Portal),问题就会消失,但它不会在全球范围内可用,我想这就是你想要的。
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2016-03-15
    • 2020-07-23
    • 2017-02-22
    • 1970-01-01
    • 2019-12-11
    • 2018-11-29
    相关资源
    最近更新 更多