「私は本当に私は本当にこれをしたいですか?」
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といくつかのtypescriptマジックを使用すれば、それを実現できます。これは関数の定義です:
isResponsiveLayout(value: keyof typeof FeatureBoxResponsiveLayout)
{
return FeatureBoxResponsiveLayout[value] == this.featureBoxResponsiveService.layout.value;
}
FeatureBoxResponsiveLayout[string]
which の使用法は、渡された文字列値を列挙型の数値に変換することに注意してください。
無効な値を使用すると、AOTコンパイルでエラーメッセージが表示されます。
タイプ '"H4orizontal' 'の引数は、タイプ'" Vertical "のパラメーターに割り当てることができません| 「水平」
現在、VSCodeはH4orizontal
HTMLエディターで下線を引くほどスマートではありませんが、コンパイル時に警告が表示されます(--prod buildまたは--aotスイッチを使用)。これは、将来のアップデートで改善される可能性もあります。