😐

【TypeScript】バージョン5系でのenum変数へのnumber型の代入

2024/11/03に公開

概要

TpeScriptではTypeScript Deep Dive 日本語版のEnumの解説によると、変数自体は数値型で保持されます。元々はenumの変数に定義されてない数値を入れるとエラーにならないようですが、サバイバルTypeScript 列挙型(enum)の問題点と代替手段によると、TypeScript5からは定義されてない値を入れようとするとエラーにしてくれるそうです。今回はこの動作を少し試してみたのでメモ書きしておきます。

前提

  • 今回使用したTypeScriptのバージョンは5.6.3です。

実装サンプル

まずは以下のようなenumの型と変数を用意します。

enum SampleEnum {
  ONE = 1,
  FIVE = 5,
  SEVEN = 7,
}

let sampleEnumValue: SampleEnum = SampleEnum.ONE;

この代入はエラーとなります。

// これはエラー
sampleEnumValue = 2;

ただ、値が特定されていないnumber型の変数はエラーとならずに通ってしまいます。

// number型の代入はOK
sampleEnumValue = parseInt("11");
// 11が代入されている
console.log(sampleEnumValue);
// 名称取得時は当然undefinedになる
console.log(SampleEnum[sampleEnumValue]);

まぁ、enumの使い方として変数の値が定義に含まれているか判定できればよいということであれば、変な値が入ってても良いのかなとは個人的に感じます。
蛇足ですが、union型であればnumber型の変数でもエラーとしてくれます。

// 値は7だけどnumber型なのでこれはエラー
const sampleUnion: 1 | 5 | 7 = parseInt("7");

Discussion