将枚举与方法合并

时间:2019-06-03 07:27:31

标签: 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';

    }

}

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

1)该类必须使用其他名称(例如'StatusUtil')-好的,我可以忍受...

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

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

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

1 个答案:

答案 0 :(得分:2)

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

有一条规则可以防止使用名称空间进行代码组织,但是Typescript仍然存在只能通过名称空间才能实现的合并场景。

直接在comment的Weswigham(ts团队成员)中找到

  
    

名称空间是否与类,函数合并并枚举名称空间的“良好”用法?

  
     

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

     

归结为:

     

如果您正在考虑使用名称空间进行代码组织:不要。模块已包含该角色。   如果您需要仅名称空间可以提供的功能: Do ,但是请检查没有名称空间(例如,具有类static或function属性,或重新导出的模块)来表达该概念是否具有同等的表达力。在同一个项目中混合名称空间和模块也是不好的风格-感觉很不好,因为传统意义上的名称空间的主要功能之一是跨文件范围合并,这种合并不会在模块之间发生(因为我说过,模块本身实际上是一个名称空间。

此外,在该线程中,不会从语言中删除名称空间,因此可以在特定情况下使用它们。