1. ホーム
  2. typescript

[解決済み] TypeScriptでEnumを比較する方法

2023-06-08 12:45:27

質問

TypeScriptで、enumの値を含む2つの変数を比較したいです。以下は私の最小限のコード例です。

enum E {
  A,
  B
}

let e1: E = E.A
let e2: E = E.B

if (e1 === e2) {
  console.log("equal")
}

でコンパイルする場合 tsc (v 2.0.3)でコンパイルすると、以下のエラーが発生します。

TS2365です。演算子 '==='は、型 'E.A' と 'E.B' に適用できません。

と同じです。 == , !==!= . を追加してみました。 const キーワードを追加してみましたが、何の効果もないようです。 その TypeScriptの仕様 には以下のように書かれています。

4.19.3 <、>、<=、>=、==、!=、===、!== 演算子

これらの演算子は、オペランド型の一方または両方が他方に代入可能であることを必要とする。結果は常にBooleanプリミティブ型になります。

これがエラーを説明するものです(と私は思います)。しかし、どのように私はそれを回避することができますか?

サイドノート

私はAtomエディタで atom-typescript で、エディタではエラーや警告が出ません。しかし、私が実行するとき tsc を実行すると、上記のようなエラーが発生します。私は、これらは同じ tsconfig.json ファイルを使用するものと思っていましたが、どうやらそうではないようです。

どのように解決するのですか?

生成されたjavascriptのコードに一切影響を与えたくない場合は、タイプキャストを使用する方法もあります。

let e1: E = E.A
let e2: E = E.B


if (e1 as E === e2 as E) {
  console.log("equal")
}

一般に、これはコントロールフローに基づく型推論によって引き起こされます。現在のtypescriptの実装では、関数呼び出しが絡むとOFFになるので、このようなことも可能です。

let id = a => a

let e1: E = id(E.A)
let e2: E = id(E.B)

if (e1 === e2) {
  console.log('equal');
}

不思議なのは、まだ id 関数がその引数と正確に同じ型を返すと宣言されている場合、エラーにならないことです。

function id<T>(t: T): T { return t; }