TypeScript instanceof エラー解説
TypeScriptでinstanceof
がエラーになる理由
TypeScriptにおけるinstanceof
エラー
TypeScriptでは、instanceof
オペレーターを使用して、オブジェクトが特定の型のインスタンスであるかどうかをチェックすることができます。しかし、以下のような状況でエラーが発生することがあります。
class Foo {}
const fooInstance = new Foo();
if (fooInstance instanceof Foo) {
// ...
}
if (Foo instanceof Foo) { // Error: 'Foo' only refers to a type, but is being used as a value here.
// ...
}
このエラーは、Foo
が型を表しているのに、値として使用されていることが原因です。
なぜこのエラーが発生するのか
- 型と値の違い
TypeScriptは、型と値を厳密に区別します。型は、変数がどのような値を保持できるかを定義するものであり、値は実際のデータです。 - instanceofの動作
instanceof
オペレーターは、左側のオペランドが右側のオペランドのインスタンスかどうかをチェックします。左側のオペランドは値でなければなりません。 - 型の使用
Foo
は型であり、値ではありません。そのため、instanceof
の左側のオペランドとして使用することはできません。
解決方法
このエラーを解決するには、instanceof
の左側のオペランドに、実際に存在するオブジェクト(インスタンス)を使用する必要があります。
const fooInstance = new Foo();
if (fooInstance instanceof Foo) {
// ...
}
このようにすることで、fooInstance
がFoo
のインスタンスであるかどうかを正しくチェックすることができます。
class Foo {}
const fooInstance = new Foo();
if (fooInstance instanceof Foo) {
// ...
}
if (Foo instanceof Foo) { // Error: 'Foo' only refers to a type, but is being used as a value here.
// ...
}
const fooInstance = new Foo();
if (fooInstance instanceof Foo) {
// ...
}
class Foo {}
const fooInstance = new Foo();
if (Foo instanceof Foo) { // Error: 'Foo' only refers to a type, but is being used as a value here.
// ...
}
代替方法
このエラーを回避するための代替方法として、以下のようなアプローチが考えられます。
型ガード
型ガードは、変数の型をより具体的な型に絞り込むための手法です。typeof
演算子やカスタム型ガード関数を使用することで、instanceof
を使用せずに型のチェックを行うことができます。
function isFoo(obj: any): obj is Foo {
return obj instanceof Foo;
}
const fooInstance = new Foo();
if (isFoo(fooInstance)) {
// ...
}
ディスクリミネータープロパティ
ディスクリミネータープロパティは、オブジェクトの型を識別するためのプロパティです。ディスクリミネータープロパティを持つオブジェクトを型ガードや条件式でチェックすることで、型の判定を行うことができます。
interface A {
type: 'A';
value: number;
}
interface B {
type: 'B';
value: string;
}
type UnionType = A | B;
function handleUnionType(obj: UnionType) {
if (obj.type === 'A') {
// obj is A
} else if (obj.type === 'B') {
// obj is B
}
}
typeof演算子
typeof
演算子を使用して、変数の型を文字列で取得することができます。この情報を元に、型のチェックを行うこともできます。
const fooInstance = new Foo();
if (typeof fooInstance === 'object' && fooInstance !== null) {
// ...
}
javascript typescript instanceof