1. ホーム
  2. javascript

[解決済み] TypeScriptの'instanceof'で「'Foo'は型を参照しているだけですが、ここでは値として使用されています」というエラーが出るのはなぜですか?

2022-05-10 02:42:36

質問

次のコードを書きました。

interface Foo {
    abcdef: number;
}

let x: Foo | string;

if (x instanceof Foo) {
    // ...
}

しかし、TypeScriptではこのようなエラーが出てしまいました。

'Foo' only refers to a type, but is being used as a value here.

なぜ、このようなことが起こるのでしょうか?と思ったのは instanceof は、値が与えられた型を持つかどうかをチェックすることができるのだが、TypeScriptはこれを好まないようだ。

解決方法は?

instanceof はインターフェースではなく、クラスで動作します。

何が起こっているのか

問題は instanceof はJavaScriptからの構成で、JavaScriptでは instanceof を期待します。 を右側のオペランドに指定します。 具体的には x instanceof Foo JavaScript は、実行時に Foo.prototype のプロトタイプチェーンのどこかに存在します。 x .

しかし、TypeScriptでは interface にはemitがありません。つまり Foo または Foo.prototype が実行時に存在しないため、このコードは間違いなく失敗します。

TypeScriptは、この可能性を伝えようとしています。 決して が動作します。 Foo は単なる型であり、値ではありません。

の代わりに何ができますか? instanceof ?quotです。

を調べることができます。 タイプガードとユーザー定義タイプガード .

しかし、もし私が interface から class ?quotです。

を使用することができます。 interface から class しかし、TypeScriptの構造的な型システム(ここでは主に 形状ベース と同じ形状のオブジェクトを生成することができます。

class C {
    a: number = 10;
    b: boolean = true;
    c: string = "hello";
}

let x = new C()
let y = {
    a: 10, b: true, c: "hello",
}

// Works!
x = y;
y = x;

この場合、あなたは xy を使ってみると、同じ型でありながら instanceof のどちらかを選択すると、もう片方では逆の結果が得られます。そこで instanceof にはなりません。 本当に TypeScriptの構造型を利用する場合、型についてあまり多くを語らない。