概要
調べた限りだと、TypeScript では enum に method は生やせないらしいのですが、それではどうやって対処するのでしょうか? enum に method が生やせないならば、型として存在する意義がほとんど失われてしまうように思うのですが、enum 自体を完全否定するような意見はあまり見当たりません。
皆さん、どう対処されているのでしょうか?
実現したいこと
気持ちとしては、以下のようなコードを動かしたいのですが、動きません。
typescript
1enum Color { 2 Black, 3 White, 4} 5 6Color.prototype.isBlack = function (): boolean { 7 return this === Color.Black; 8};
例えば Rust だったら、
rust
1#[repr(u8)] 2#[derive(Eq, PartialEq, Clone, Copy, Debug)] 3pub enum Color { 4 Black, 5 White, 6} 7impl Color { 8 pub fn is_black(&self) -> bool { 9 match self { 10 Self::Black => true, 11 Self::White => false, 12 } 13 } 14}
Go だったら、
go
1type Color bool 2const ( 3 Black Color = true 4 White Color = false 5) 6func (color Color) IsBlack() bool { 7 return color == Black 8}
Julia だったら、
julia
1@enum Color::Bool black=true white=false 2isblack(color::Color) = Integer(color)
のようなことをどうやって実現すれば良いのでしょうか?
とりあえず、以下のように書いてしのいでいますが、困っています。
typescript
1class Color { 2 constructor(private readonly n: boolean) {} 3 isBlack(): boolean { 4 return this.n; 5 } 6} 7const BLACK = new Color(true); 8const WHITE = new Color(false);
> enum に method が生やせないならば、型として存在する意義がほとんど失われてしまうように思うのですが
どうしてそうお考えでしょうか?
> enum 自体を完全否定するような意見はあまり見当たりません。
TypeScript の enum は使わないほうがいいという意見が一般的かと…。
https://qiita.com/saba_can00/items/696baa5337eb10c37342
maisumakun さんへ
単なるプリミティブな定数でなくて、列挙型を使うメリットは列挙型とその値に対してポリモルフィックになるからだと思うからです。JavaScript では関数のオーバーロードができないので、クラスに対してポリモルフィックになるメソッド生やしを使いますよね。TypeScript は JavaScript の型付き版であるという思想に従うならば、列挙型を実装するものにメソッドが生やせることが期待されるからです。