我发现将枚举与名称空间合并的做法非常有用。例如:
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依赖注入而不是静态方法。 您认为最佳做法是什么?
答案 0 :(得分:2)
我认为这是抑制tslint警告的一个好案例。 Tslint可以指出您的代码可能存在的问题,但是您可以使用注释在代码中隐藏这些问题。
有一条规则可以防止使用名称空间进行代码组织,但是Typescript仍然存在只能通过名称空间才能实现的合并场景。
直接在comment的Weswigham(ts团队成员)中找到
:名称空间是否与类,函数合并并枚举名称空间的“良好”用法?
有时-由于我们无法识别某些静态属性的临时附件,因此可能有必要-在许多情况下,函数或类的静态属性就足够了(除非您需要包含类型)。尽管质疑您是否真的需要合并开始同样有效-例如,如果您想将一个组件及其参数类型相关联,从同一模块中导出它们是否足够?为什么还要将它们包装在命名空间中?那里没有意义。
归结为:
如果您正在考虑使用名称空间进行代码组织:不要。模块已包含该角色。 如果您需要仅名称空间可以提供的功能: Do ,但是请检查没有名称空间(例如,具有类static或function属性,或重新导出的模块)来表达该概念是否具有同等的表达力。在同一个项目中混合名称空间和模块也是不好的风格-感觉很不好,因为传统意义上的名称空间的主要功能之一是跨文件范围合并,这种合并不会在模块之间发生(因为我说过,模块本身实际上是一个名称空间。
此外,在该线程中,不会从语言中删除名称空间,因此可以在特定情况下使用它们。