[解決済み] Typescript によるインターフェース型チェック
質問
この質問は TypeScriptによるクラス型チェック
any型の変数があるインターフェースを実装しているかどうかを実行時に調べる必要があります。以下は私のコードです。
interface A{
member:string;
}
var a:any={member:"foobar"};
if(a instanceof A) alert(a.member);
このコードをタイプスクリプトのプレイグラウンドに入力すると、最後の行に "The name A does not exist in current scope" というエラーマークが表示されるでしょう。しかし、それは真実ではなく、名前は現在のスコープに存在するのです。変数の宣言を次のように変更することもできます。
var a:A={member:"foobar"};
エディタから文句を言われることもなく WebをブラウズしてSOの他の質問を見つけた後、私はインターフェイスをクラスに変更しましたが、その後、インスタンスを作成するためにオブジェクトリテラルを使用することはできません。
Aという型がどうして消えるのか不思議でしたが、生成されたjavascriptを見ると問題がよくわかります。
var a = {
member: "foobar"
};
if(a instanceof A) {
alert(a.member);
}
Aはインターフェースとして表現されていないため、実行時の型チェックはできません。
動的言語であるjavascriptにはインターフェースの概念がないそうですね。インターフェイスの型チェックをする方法はないのでしょうか?
typescript playgroundのオートコンプリートによると、typescriptにはメソッドまで用意されていることがわかります。
implements
. どうすれば使えるの?
解決方法は?
を使わなくても、やりたいことは実現できます。
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);
}
関連
-
fetch ネットワークリクエストラッパーの説明例
-
jsを使った簡単な照明スイッチのコード
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み】jQueryでチェックボックスがチェックされているかどうかを確認するにはどうすればよいですか?
-
[解決済み】TypeScriptのインターフェースと型について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
jsを使った簡単な照明スイッチのコード
-
Vueにシンプルなメモ帳機能を実装
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
JSクリックイベント - Uncaught TypeError: プロパティ 'onclick' に null を設定できません。
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR
-
[解決済み] TypeScriptのクラス型チェック
-
[解決済み] Typescript で JSON 文字列をパースする方法
-
[解決済み] TypeScriptの'instanceof'で「'Foo'は型を参照しているだけですが、ここでは値として使用されています」というエラーが出るのはなぜですか?
-
[解決済み] TypeScriptでメソッドのオーバーローディングをする方法はありますか?