実現したいこと
ユニオン型を、 0 | 1 | 2のようにマジックナンバー指定するのではなく、
オブジェクトリテラルでのプロパティ名で指定したいです。
const DataType = { A_1: 0, A_2: 1, A_3: 2, B_1: 3, B_2: 4, C_1: 5, C_2: 6, C_3: 7, } as const type DataTypeA = DataType.A_1 | DataType.A_2 | DataType.A_3 type DataTypeB = DataType.B_1 | DataType.B_2 type DataTypeC = DataType.C_1 | DataType.C_2 | DataType.C_3
as const で変更不可能な静的データ保証をしているから、DataTypeA は 0 | 1 | 2 相当として解釈してくれるのを期待したのですが、
Cannot find namespace 'DataType'
とネームスペースとして解釈されて、
type DataType.A_1 = /*unresolved*/ any
となってしまいます。
typeof とか keyofとかを駆使すればなんとかなりそうな気がするんですが、どうすればいいのでしょうか?
前提
enumで定義しろ、という回答は申し訳ありませんが、意味がありません。
最終目標は、「enum(またはそれに準ずるもの)として型定義されたものは、マジックナンバー(number値)との比較を禁止(または検出)できないだろうか?」です。
enumで定義すれば上記のようなエラーはでませんが、マジックナンバー比較禁止はできなさそうでした。
今はオブジェクトリテラルではできないだろうか、という調査中なのです。
なお、eslintのno-magic-numbersは、目的外のあらゆる箇所でのマジックナンバー使用を指摘されて、意図に沿いませんでした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/06/24 22:38