将枚举与方法合并

Merging enums with methods

我发现将枚举与名称空间合并的做法非常有用。示例:

enum Status : {
    OK = 1,
    NOT_OK = 2,
}

namespace Status {

    function Color(status : Status) {

        if(status == Status.OK)
            return 'green';
        else
            return 'red';

    }

}

但我发现 tslint 不喜欢它们... 我可以使用哪些其他方法来获得相同的行为? 我考虑过用静态方法替换 class 中的命名空间,但它有两个缺点:

1) class 必须使用不同的名称(例如 'StatusUtil')- 好的,我可以接受...

2) 'StatusUtil' class(与名称空间不同)在使用 Angular 时无法直接从 HTML 文件调用 - 这意味着我必须额外编写每个组件中的方法,像这样:

getColor(status : Status) {
    return StatusUtil(status);
}

我想到的另一个选择是使用 Angular 依赖注入而不是静态方法。 您认为最佳做法是什么?

我认为这是抑制 tslint 警告的好案例。 Tslint 可以指出您的代码可能存在的问题,但您可以使用注释在代码中抑制这些问题。

规则是为了防止在代码组织中使用命名空间,但 Typescript 仍然存在只能使用命名空间实现的合并场景。

直接来自 weswigham(ts 团队成员)comment:

Is namespace merging with class, function and enum a 'good' use of namespaces?

有时 - 由于我们无法识别 ad-hoc 某些类型的静态属性的附件,因此可能有必要 - 在许多情况下 ad-hoc 属性 函数或class static 就足够了(除非你需要它包含类型)。虽然质疑您是否真的需要开始合并同样有效 - 例如,如果您想要关联一个组件及其参数类型,那么从同一个模块中导出它们是否足够?为什么还要将它们包装在命名空间中?那里没有意义。

归结为:

如果您正在考虑使用命名空间组织代码:不要。模块承担了这个角色。 如果您需要只有名称空间可以提供的功能:Do,但请检查它是否在没有名称空间的情况下表达概念的表现力相同(例如,使用 class 静态或函数 属性,或重新导出的模块)。在同一个项目中混合命名空间和模块也是一种糟糕的风格 - 它只是感觉不对,因为传统意义上命名空间的主要特征之一是 cross-file 范围合并,这不会跨模块发生(因为,正如我所说,模块本身实际上是一个命名空间)。

同样在该线​​程中,命名空间不会从语言中删除,因此可以将它们用于特定场景。