何らかの方法がありますか?オブジェクトがインタフェースを実装しているかどうかを検出できますか?オブジェクトが動的にTypeScriptに実装されているかどうかを確認する
if(myObj implements IMyInterface) {
//... do something
}
何らかの方法がありますか?オブジェクトがインタフェースを実装しているかどうかを検出できますか?オブジェクトが動的にTypeScriptに実装されているかどうかを確認する
if(myObj implements IMyInterface) {
//... do something
}
はい。これで、TypeScriptコンパイラの拡張版を使用して、アプリケーションの各クラスを実装するインターフェイスを知ることができます。このバージョンのコンパイラは、実行時まですべての型情報を格納し、これらの情報を実際のコンストラクタにリンクします。たとえば、次のようなものを書くことができます。
function implementsInterface(object: Object, target: Interface) {
const objClass: Class = object.constructor && object.constructor.getClass();
if (objClass && objClass.implements) {
let found = false;
for (let base of objClass.implements) {
let found = interfaceExtends(base, target);
if (found) {
return true;
}
}
}
return false;
}
// recursive interface inheritance check
function interfaceExtends(i: Interface, target: Interface) {
if (i === target) {
return true;
}
if (i.extends) {
let found = false;
for (let base of i.extends) {
// do a recursive check on base interface...
found = interfaceExtends(base, target);
if (found) {
return true;
}
}
}
return false;
}
あなたはhere
号
現在、タイプは、開発時のみに使用し、時間をコンパイルしています。 型情報は、コンパイルされたJavaScriptコードに変換されません。
コンパイラによるコード生成によって、これが可能になります。現時点では、TypeScriptチームは、最終的なJavaScriptに可能な限り小さなコードを追加しようとしていますが、コンパイルされた出力に新しいメソッドを追加する 'extends'キーワードは例外です。
はい、あなたが構成可能なタイプのバリデータでこれを行うことができ、あなたのニーズに合った完全な作業例を見つけることができます。このライブラリをチェックアウト:https://github.com/pelotom/runtypes
オブジェクトリテラルでは機能しますか? –
はい。テストしなければならないオブジェクトがクラスのインスタンスでない場合、このチェックはフィールドごとに行うことができます。メソッドに渡すインターフェース・メタオブジェクトは、すべての詳細(オプションのフィールドなど)を通知し、それらをオブジェクトに対してチェックすることができます。この種のチェックは遅くなりますが、うまくいくでしょう。開始点として[this](https://github.com/pcan/reflec-ts-examples/tree/master/simple-validator)の例を参照してください。 – pcan
空のインターフェイスでも動作しますか? –