Typescriptによるインターフェース型チェック 質問する

Typescriptによるインターフェース型チェック 質問する

この質問は、TypeScript でのクラス型チェック

実行時に、any 型の変数がインターフェースを実装しているかどうかを確認する必要があります。コードは次のとおりです。

interface A {
    member: string;
}
    
var a: any = { member: "foobar" };
    
if (a instanceof A) alert(a.member);

このコードを TypeScript プレイグラウンドに入力すると、最後の行がエラーとしてマークされ、「名前 A は現在のスコープに存在しません」と表示されます。しかし、これは正しくありません。名前は現在のスコープに存在します。変数宣言を に変更しても、var a:A={member:"foobar"};エディターからの苦情はありません。Web を閲覧して SO の他の質問を見つけた後、インターフェイスをクラスに変更しましたが、オブジェクト リテラルを使用してインスタンスを作成できなくなりました。

タイプ A がこのように消えてしまうのはなぜかと思いましたが、生成された JavaScript を見ると問題がわかります。

var a = {
    member: "foobar"
};

if (a instanceof A) {
    alert(a.member);
}

A はインターフェースとして表現されていないため、実行時の型チェックは不可能です。

動的言語としての JavaScript にはインターフェースの概念がないと理解しています。インターフェースの型チェックを行う方法はありますか?

Typescript プレイグラウンドの自動補完により、Typescript が メソッド を提供していることがわかりますimplements。これをどのように使用すればよいでしょうか?

ベストアンサー1

instanceof次のようにカスタム型ガードを記述できるため、キーワードなしでも目的を達成できます。

interface A {
    member: string;
}

function instanceOfA(object: any): object is A {
    return 'member' in object;
}

var a: any = {member: "foobar"};

if (instanceOfA(a)) {
    alert(a.member);
}

たくさんのメンバー

オブジェクトが型に一致するかどうかを判断するために多くのメンバーをチェックする必要がある場合は、代わりに識別子を追加できます。以下は最も基本的な例であり、独自の識別子を管理する必要があります。識別子の重複を回避するには、パターンをさらに深く理解する必要があります。

interface A {
    discriminator: 'I-AM-A';
    member: string;
}

function instanceOfA(object: any): object is A {
    return object.discriminator === 'I-AM-A';
}

var a: any = {discriminator: 'I-AM-A', member: "foobar"};

if (instanceOfA(a)) {
    alert(a.member);
}

おすすめ記事