2016-09-28 4 views
2

は、私は次のコードを持って言う:TypeScriptで2つの異なるオブジェクトタイプを区別するにはどうすればよいですか?

function myFunction(x: { foo: number } | { bar: string }) {

私はxは、第1または第2のタイプであるかどうかを判断するためにいくつかのコードを書くことができますどのように?私はと考えられてきた

もの:

  • fooプロパティをチェックするx is MyType機能を書き込みます。はい、私はこれを行うことができますが、1つの関数の引数としてのみ使用される型の場合は過剰です。
  • if ((x as { foo: number}).foo) { let y = x as { foo: number }。私はこれを行うことができましたが、タイプシステムのポイントを打ち負かします。
  • 両者に共通のtypeプロパティを指定します。繰り返しますが、1つの関数の引数としてのみ使用される型の場合は、過剰なようです。

答えて

3

これは、回避策もですが、それぞれのタイプは、理論的には労働組合に可能なあらゆるフィールドを持っているので、neverに型指定されたオプションのフィールドを使用して、既存の型を拡張することで、型のフィールドを統一することができます

スーパーセットのタイプにすることにより
{ foo: number, bar?: never } | { bar: string, foo?: never } 

あなたのようなタイプのチェックを実行することができますすべてのフィールド含まれていますよ場合

type CompletelyDisjointed = { foo: number, bar?:never } | { foo?: never, bar: string }; 

function myFunction(x: CompletelyDisjointed): string | number { 
    if (typeof x.bar === 'string') { 
     return x.bar; 
    } else { 
     return x.foo; 
    } 
} 
+1

あなたはまた、元のパラメータの型が変更されていないことができますあなたは別の代入で互換性のある統一型を好きです: 'let tx:{f​​oo ?: number、bar ?: string} = x; if(typeof tx.foo!== 'undefined'){...}です。また、union型が互いに素であることを暗示することは決してありません。xには 'foo'と' bar'の両方があります。あなたがそれを分離したい場合は、答えの正確な形式を使用する必要があります。 – artem

+0

これは非常に賢いです。うまくいけばもっと良い解決策がいつか来るかもしれませんが、これは今のところ適当です。 – thedayturns

関連する問題