2017-12-04 5 views
1

私の関数でパラメータとして渡されたオブジェクトの型を取得する方法を調べようとしています。あなたは、コードを次している。例えばinstanceof関数のパラメータがTypescript/Angularでfalseを返す

getTypeOfAnimal(animal){ 
    console.log(animal instanceof Cat) 
    console.log(animal instanceof Bear) 
} 

動物は、instanceofは猫や熊のどちらかである可能性があります。私のフォームから渡された動物は常にfalseを返します(Objectの構造がCatまたはBearのいずれかと一致するようでも)。

タイプを正しく取得する方法はありますか?

+1

typeofはオブジェクトの型ではなく「オブジェクト」を返します – Nicholas

+0

動物はどのように作成されますか? '新しいCat()'や 'new Bear()'を使っていますか? 'instanceof'構造体にマッチするオブジェクトがあればtrueを返しません –

答えて

4

オブジェクトの構造は、オブジェクト構造は、ここでは問題ではありません猫の1またはベア

と一致するように思われる場合は、問題の根本は、この行はまた

です。 instanceofは、オブジェクトがCatまたはBearのコンストラクタを使用して作成されたかどうかをチェックします。 new Cat()(実際には両方ともAnimalの場合、instanceof Animalは両方ともtrueとなります)。

通常、タイプ・スクリプトはduck typingを使用して、インタフェースがオブジェクト構造と一致しているかどうかを判断します。これは類似のオブジェクト構造が機能する場所です。しかし、instanceofはJavaScript(ランタイムで実行されるため)であるため、これ以上TypeScriptが実行できません。そういうわけで、あなたが期待したとおりに動作しません。

+0

あなたのコメントをありがとう。現在、私のコンポーネントにはCatsの配列があり、ngForを使用してこれをフォームにループします。次に、フォームのgetTypeOfAnimal関数を使用し、catはngForから渡されます。 新しいCat()で実際には作成されません。私のモデルではコンストラクタが定義されていますか? – Nicholas

+0

はい、cats配列が入力されている場所を確認してください。あなたがすることができることは、猫が持っているプロパティをチェックすることであり、熊はそれが「猫」であることを意味しません。これはダックタイピングと呼ばれるものですが、汚れていますが、小さなケースでも動作する可能性があります – smnbbrv

+0

もう一度お返事ありがとうございます。私が今行ったことは、関数内のいくつかのカスタムプロパティをチェックすることでした。 だから例えば getTypeOfAnimal(動物){ IF(animal.hasOwnProperty( 'プロパティ1'){ リターン "CAT"; }そうであれば(動物。hasOwnProperty( 'property2'){ リターン "bear"; } } 私が期待していた解決策ではないかもしれませんが、現在はうまくいきます... – Nicholas

0

、階層内のクラスを扱っている場合は、instanceofを使用することができます。

class Animal { 
    name: string; 
} 

class Cat extends Animal { 
    purrs: boolean; 
} 

class Bear extends Animal { 
    growls: boolean; 
} 


const animal = new Cat(); 
console.log(animal instanceof Cat); // true 
console.log(animal instanceof Bear); // false 

あなたが狭めたい構造のタイプを扱う場合、カスタムタイプのガードを使用することができます。

const structuralBear = { 
    name: 'Paddington', 
    growls: false 
}; 

console.log(structuralBear instanceof Cat); // false 
console.log(structuralBear instanceof Bear); // false 

function isBeary(obj: any): obj is Bear { 
    console.log(typeof obj.growls); 
    return (typeof obj.name === 'string' && typeof obj.growls === 'boolean'); 
} 

console.log(isBeary(structuralBear)); 

あなたのニーズに十分なものがあれば、これはうまくいくでしょう...

このようにタイプについてあまりにも多くのことを知る必要があることには、主な使用例は、ユニオンタイプを絞り込むことです。

関連する問題