首先考虑“我真的要这样做吗?”
我在 HTML 中直接引用枚举没有问题,但在某些情况下,有更简洁的替代方案不会失去类型安全性。
例如,如果您选择我的其他答案中显示的方法,您可能已经在组件中声明了 TT,如下所示:
public TT =
{
// Enum defines (Horizontal | Vertical)
FeatureBoxResponsiveLayout: FeatureBoxResponsiveLayout
}
要在您的 HTML 中显示不同的布局,您需要为每种布局类型设置一个 *ngIf,并且您可以直接引用组件 HTML 中的枚举:
*ngIf="(featureBoxResponsiveService.layout | async) == TT.FeatureBoxResponsiveLayout.Horizontal"
此示例使用服务获取当前布局,通过异步管道运行它,然后将其与我们的枚举值进行比较。它非常冗长,令人费解,而且看起来并不有趣。它还公开了枚举的名称,它本身可能过于冗长。
替代方案,保留 HTML 的类型安全
或者,您可以执行以下操作,并在组件的 .ts 文件中声明更具可读性的函数:
*ngIf="isResponsiveLayout('Horizontal')"
更干净!但是如果有人错误地输入了'Horziontal' 怎么办?您想在 HTML 中使用枚举的全部原因是为了保证类型安全,对吧?
我们仍然可以通过keyof 和一些打字稿魔法来实现这一目标。这是函数的定义:
isResponsiveLayout(value: keyof typeof FeatureBoxResponsiveLayout)
{
return FeatureBoxResponsiveLayout[value] == this.featureBoxResponsiveService.layout.value;
}
注意FeatureBoxResponsiveLayout[string]的用法,其中converts将字符串值传递给枚举的数值。
如果您使用无效值,这将在 AOT 编译时给出错误消息。
“H4orizontal”类型的参数不能分配给“垂直”类型的参数 | “水平”
目前 VSCode 不够智能,无法在 HTML 编辑器中为 H4orizontal 下划线,但您会在编译时收到警告(使用 --prod build 或 --aot 开关)。这也可能在未来的更新中得到改进。