2017-06-27 6 views
0

不明なオブジェクトが特定のタイプであるかどうかを(実行時に)確認するにはどうすればよいですか?それを正式にそのタイプに変換し、それと何かをしますか?オブジェクトがGoogleクローズのタイプであるかどうかを確認し、それを変換しますか?

私はこのような何かをしたい:Fruitは、属性の名前と色を持つクラスがある

const /** {Object} */ someObject = {name: 'Apple', color: 'Red'}; 
if (someObject is Fruit) { 
    // Convert to {Fruit} and do something with it. 
    return /** {Fruit} */ (someObject); 
} 

より具体的には、JSON.parseからオブジェクトを取得しているので、具体的には、コンストラクタを使用してFruitオブジェクトを作成することはできません。

は、これまで私が試してみた:これはfalseに

if (someObject instanceof Fruit) 

解決します。

const aFruit = /** @type {Fruit} */ someObj; 
をしかし、私はそれはまだ Fruitとして扱われるプロパティの名前や色を持っていない someObjを渡すとき、これは実際には、つまり...何もしていないようです。そして、私が試してみました。

もっと複雑なカスタムソリューションが必要なのでしょうか?つまり、これはClosureに組み込まれているのですか、それとも私自身で属性をチェックするだけですか?

+1

閉鎖型は、コンパイル時にのみ存在します。 – SLaks

+0

'/ ** @type {Fruit} * /'がどのように動作するのかについての説明がありますが、ここではうまくいかない理由は「自分ではできません。 。 – hubatish

+0

'instanceof'テストは、オブジェクトが' new'で作成されたとき(あるいはJavaScriptの 'property'値が手作業で配列されているとき)にのみ動作します。プロパティからどのタイプのオブジェクトをテストする方法がありますか?そうであれば、最初の例に示すようにタイプキャストを使うことができます。 – owler

答えて

0

instanceofはあなたが探しているものです。これは、特定のコンストラクタ関数(またはより良いES2015クラス)から任意の値が作成されたかどうかをチェックする方法です。

const /** {Object} */ someObject = new Fruit('Apple', 'red'); 
if (someObject instanceof Fruit) { 
    // Convert to {Fruit} and do something with it. 
    return /** {Fruit} */ (someObject); 
} 

しかし、元の例では、オブジェクトを果物にするのは何ですか?匿名オブジェクトを使用しています。 namecolorのオブジェクトに果物がありますか?これは少しはっきりしていないし、実装固有のものです。あなたは自分自身に答えることができる必要があります。「オブジェクトを果物にする理由」

あなたはオブジェクトがフルーツ・インタフェース(正しい性質を持っている)を実装するかどうかを確認したい場合は、単にそれらのプロパティをチェック:

/** 
* @param {!Object} obj 
* @return {boolean} 
*/ 
function isFruit(obj) { 
    return obj.color && obj.name; 
} 
-1

クローズの型システムは、コンパイル時にのみ存在します。

キャストは単にタイプシステムに「この値が実際にこのタイプであることを保証しますが、証明できませんが」と伝えます。
これが当てはまらない場合は、未定義の動作が(特に高度な最適化を使用して)得られます。

+0

これは厳密には当てはまりません。ほとんどの型はコンストラクタまたはインタフェースに基づいています。いずれかを実行時にチェックすることができます。 –

+0

@ChadKillingsworth:インターフェースは使用できません。 – SLaks

+0

もちろん可能です。インターフェイスは単なるプロパティのセットです。特定のタイプに一致するプロパティを持つオブジェクトは、実行時にチェックできます。 –

関連する問題