2017-02-08 43 views
1

私はパラメータを取るメソッドを持っています。私は、Typescriptが渡されているオブジェクト(typescriptコンパイル時に、実行時が別の動物であることを理解している)が、許可されたインタフェースのうちの1つを満たしていることを確認します。Typescriptは相互に排他的な型をサポートしていますか?

例:

interface Person {ethnicity: string;} 
interface Pet {breed: string;} 
function getOrigin(value: Person^Pet){...} 

getOrigin({}); //Error 
getOrigin({ethnicity: 'abc'}); //OK 
getOrigin({breed: 'def'}); //OK 
getOrigin({ethnicity: 'abc', breed: 'def'});//Error 

私はPerson^Petが有効活字体ではないことを認識し、それは私がしようとする考えと合理的に思えた最初のことです。

あなたが union types使用することができます
+0

私は*([タイプガード]あなたが探しているもの*だと思うHTTPS ://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html)。 AFAIK TypeScriptは排他型をサポートしていません。 – Amy

答えて

1

function getOrigin(value: Person | Pet) { } 

をしかし、最後の文はエラーではありません。

getOrigin({ethnicity: 'abc', breed: 'def'}); // fine! 

あなたはそれがエラーになりたいなら、あなたはoverloadingを使用する必要があります:

function getOrigin(value: Pet); 
function getOrigin(value: Person); 
function getOrigin(value: Person | Pet) {} 
2

Nitzanの答えを増やすには、本当にethnicitybreedが相互に排他的に指定されている、あなたが特定のフィールドが存在しないことを強制するためにマップされた型を使用できることを強制する:

type Not<T> = { 
    [P in keyof T]?: void; 
}; 
interface Person {ethnicity: string;} 
interface Pet {breed: string;} 
function getOrigin(value: Person & Not<Pet>): void; 
function getOrigin(value: Pet & Not<Person>): void; 
function getOrigin(value: Person | Pet) { } 

getOrigin({}); //Error 
getOrigin({ethnicity: 'abc'}); //OK 
getOrigin({breed: 'def'}); //OK 

var both = {ethnicity: 'abc', breed: 'def'}; 
getOrigin(both);//Error 
関連する問題