我发现将枚举与命名空间合并的做法非常有用。示例:
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 依赖注入(inject)而不是静态方法。 您认为最佳实践是什么?
最佳答案
我认为这是抑制 tslint 警告的好例子。 Tslint 可以指出代码中可能存在的问题,但您可以使用注释在代码中抑制这些问题。
该规则是为了防止使用命名空间来组织代码,但 Typescript 仍然存在只能使用命名空间才能实现的合并场景。
直接来自 weswigham(ts 团队成员),comment :
有时 - 由于我们无法识别某些类型的静态属性的临时附件,因此可能是有必要的 - 在许多情况下,函数或类静态的临时属性就足够了(除非您需要它包含类型),但是。尽管质疑您是否真的需要合并也同样有效 - 例如,如果您想要关联一个组件及其参数类型,那么从同一个模块导出它们还不够吗?为什么还要将它们包装在命名空间中?那里没有任何意义。Is namespace merging with class, function and enum a 'good' use of namespaces?
归结为:
如果您正在考虑使用命名空间来组织代码:不要。模块已经承担了这个角色。 如果您需要只有命名空间才能提供的功能:做,但请检查在没有命名空间的情况下表达概念是否具有同等的表达能力(例如,使用类静态或函数属性,或重新导出的模块)。在同一个项目中混合命名空间和模块也是一种不好的风格 - 它只是感觉不太好,因为传统意义上的命名空间的主要功能之一是跨文件范围合并,这不会发生在模块之间(因为,我说了,模块本身其实就是一个命名空间)。
block 引用>此外,在该线程中,命名空间不会从语言中删除,因此可以将它们用于特定场景。
关于angular - 将枚举与方法合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56422845/