Angular 将枚举与方法合并

Angular 将枚举与方法合并,angular,typescript,tslint,Angular,Typescript,Tslint,我发现将枚举与名称空间合并的做法非常有用。例如: enum Status : { OK = 1, NOT_OK = 2, } namespace Status { function Color(status : Status) { if(status == Status.OK) return 'green'; else return 'red'; } } 但我发现tslin

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

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

namespace Status {

    function Color(status : Status) {

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

    }

}
但我发现tslint不喜欢他们。。。 为了获得相同的行为,我还可以使用哪些其他方法? 我曾考虑用静态方法在类中重新跟踪名称空间,但它有两个缺点:

1) 该类必须获得不同的名称(例如“StatusUtil”)-好的,我可以接受这个名称

2) 在使用Angular时,不能直接从HTML文件调用“StatusUtil”类(与命名空间不同),这意味着我必须在每个组件中编写额外的方法,如下所示:

getColor(status : Status) {
    return StatusUtil(status);
}
我考虑的另一个选择是使用角度依赖注入,而不是静态方法。
您认为什么是最佳做法?

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

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

直接从weswigham(ts团队成员)处获得:

名称空间与类、函数和枚举的合并是名称空间的“好”用途吗

有时——由于我们无法识别特定类型静态属性的特殊附件,因此可能需要这样做——在许多情况下,函数或静态类上的特殊属性就足够了(除非您需要它包含类型)。尽管质疑您是否真的需要合并开始同样有效——例如,如果您想关联组件及其参数类型,那么从同一个模块导出这两个组件是否就足够了?为什么还要将它们包装在名称空间中?这没有意义

归结起来就是:

如果您正在考虑使用名称空间来组织代码:不要。模块已经包含了这个角色。 如果您需要只有名称空间才能提供的功能:Do,但请检查在没有名称空间的情况下表达概念(例如,使用类静态或函数属性,或重新导出的模块)是否具有相同的表达能力。在同一个项目中混合使用名称空间和模块也是一种糟糕的风格——这让人感觉不舒服,因为传统意义上名称空间的一个主要特性是跨文件范围合并,这不会发生在模块之间(正如我所说的,模块本身实际上是一个名称空间)


同样,在该线程中,名称空间不会从语言中删除,因此在特定场景中使用它们是可以的。

Tslint对名称空间有一个全面的规则。您应该避免使用名称空间而不是模块,但是合并仍然是它们的有效用途。