Proposal for ECMAScript enumsについて(2025-06-06時点)
https://gyazo.com/defda56b8612cb9f7b78a0ac630e7fc5
この資料は TSKaigi 2025事後勉強会 —— まだまだ型りたい のLT資料です。
https://gyazo.com/a6d28b60f6d8d7af63407708ad65cebf
メニューのドキュメントアイコンより「プレゼンテーションを開始」クリックでプレゼンテーションが始まります
自己紹介
yamanoku.icon @ やまのく
TSKaigi 2025ではEnumで笑いをとっていた人です
https://gyazo.com/bfca3514cbff1f84edfb8b49e59bb062 https://yamanoku.net/tskaigi-2025/
会場では皆様に笑っていただけたのでやれてよかったです
JSConfJP 2024でもお笑い枠があったので後続のカンファレンス芸人枠にも期待しています
そもそも何故Enumの話をしてみた?
社内でのフロントエンド勉強会でEnumに関する話題がでる
「Enumは時代遅れ」
Union型か、オブジェクトリテラルを使ったほうがいい
各所でも散々言われてる悲しいやつ
列挙型(enum)の問題点と代替手段 | TypeScript入門『サバイバルTypeScript』
さようなら、TypeScript enum - 株式会社カブク
TypeScriptのenumを使わないほうがいい理由を、Tree-shakingの観点で紹介します
たしかにEnumを使うことはあまりないが、そんなに言われることだろうか…yamanoku.icon
Enumがどういうものなのかを改めて見直す旅にでました
最初はどうしようもない悲しいストーリーで終わるつもりだった
Enumの良いところを探そうとしつつもなかなか説得力のある材料が見当たらず。。。
Node.jsやTypeScript側もオプションでEnumなどのTS特有機能をなかったことにしようとしてるし。。。
プロポーザル採択後にProposal for ECMAScript enumsを見かける
更新が入ってStage 1に移行した!
哀れななろう系→追放無双系にできないか?
Proposal for ECMAScript enums
https://gyazo.com/b51898b26f8e7379d424632ec09b03b2
Ron Buckton氏によるプロポーザル
TypeScriptのEnum構文と大部分で互換性を持つように設計されている
一部は違う挙動になっている
TypeScriptのEnumとTC39のEnumはどう違う?
自動初期化
code:initialize.js
enum Numbers {
zero, // 0
one, // 1
two // 2
}
TypeScript.icon やる
数値のEnumで自動初期化をサポート
TC39.icon やらない(削除)
安全な代替構文を検討したい
宣言マージ(declaration merging)
TypeScript.icon できる
ただしTypeScript 6.0からは非推奨扱い へ
TC39.icon できない(やらない)
偶発的な拡張を防止する目的
逆マッピング
TypeScript.icon Enum[value]形式で抽出
数値のEnumのみサポート
TC39.icon Symbol.iteratorを使用
すべての値の型に対して[key, value]ペアをイテレート
const enumでの概念
TypeScript.icon コンパイル時に削除する
TC39.icon JavaScriptエンジン側に委ねる
SymbolおよびBigInt値のサポート
TypeScript.icon サポートしていない
TC39が採用されたらサポート予定
TC39.icon サポートする
export defaultのサポート
TypeScript.icon サポートしていない
TC39.icon サポートする
既存のモジュールシステムと整合
Algebraic Data Type (ADT) Enums
Enumの将来的発展としての代数型Enumについて
判別プロパティを持つオブジェクトを生成するコンストラクタ関数のような機能
パターンマッチのプロポーザルとも連携予定
GitHub - tc39/proposal-pattern-matching: Pattern matching syntax for ECMAScript
code:sample.js
enum Option {
Some(value), // 値がある状態
None() // 値がない状態
}
const opt = Option.Some(123); // Some(123)という値を作成
// パターンマッチを使って、値の状態に応じて処理を分岐
match (opt) {
Option.Some(let value): console.log(value); // 'Some'の場合、値を取り出して表示
Option.None(): console.log("<no value>"); // 'None'の場合の処理
}
code:sample.js
enum Result {
Ok(value), // 成功した場合の値
Error(reason) // エラーの場合の理由
}
function try_(cb) {
try {
return Result.Ok(cb());
} catch (e) {
return Result.Error(e);
}
}
// 何らかの処理を実行し、結果をResult型で取得
const res = try_(() => obj.doWork());
match (res) {
Result.Ok(let value): /* 成功時の処理 */ ;
Result.Error(let reason): /* エラー時の処理 */ ;
}
加えて、デコレータとの連携・発展も提案中
code:enum_n_decorator.js
@WasmType("u1")
enum Role {
@Alias("user", "person", { ignoreCase: true }) // 'user' メンバーにエイリアスを定義
user = 1,
@Alias("admin", "administrator", { ignoreCase: true }) // 'admin' メンバーにエイリアスを定義
admin = 2,
}
どうなる?Proposal for ECMAScript enums...
TypeScript固有だった機能のEnumがちゃんと使われる未来を期待したいが…!
@rbuckton: After 18 years at Microsoft, with roughly a decade of that time working on TypeScript, I have unfortunately been let go in the latest round of layoffs. I need to take a few days to process before I start looking for work. Thanks to everyone who's been part of my journey so far.
プロポーザルのチャンピオンでもあるRon Buckton氏がマイクロソフトをレイオフされる…
@j_ktwr:
EnumがTSから追放された
↓
EcmaScriptで採用されるかも?
↓
推進してた人がMicroSoftから追放された
これをこんなに面白おかしく話せるの天才
#TSKaigi2025
この発想まで至らなかったyamanoku.icon
引き続きTC39で動向をチェックしていきたい
TSKaigi 2025の発表を通じてEnumとしての価値を再認識できた
TC39と共にTypeScriptの方も見直される可能性
TypeScriptでEnumが活躍する未来もいつかくるかもしれない
yamanoku.iconはEnumの夢を見たいと思います
Thank you for listening !
https://gyazo.com/4c1d0df4903765cc351797c10f903ba1