2017-07-26 15 views
2

"or"タイプで奇妙な動作が見つかりました。バグや機能の場合はわかりません... 達成したいこと:私の変数は、プロパティ 'data'を持つオブジェクトまたはプロパティ 'records'を持つオブジェクトのみを許可する必要があります。しかし、 'データ'と 'プロパティ'の両方を持つオブジェクトではありません。 ので:私の意見ではtypescript 2.4.2 "or" strange behavior

type X = { 
    data: string 
}; 
type Y = { 
    records: { 
    [recordId: number]: { 
     [attributeName: string]: any, 
    } 
    }, 
}; 

type XorY = X | Y; 


let a:XorY = { 
    data: 'something', 
    records: { 
    12: { 
     someKey: 'someValue', 
    } 
    } 
}; 

、への代入はエラーをスローする必要があります。任意のアイデア、私はどのようにTSでそのようなチェックを行うことができますか?

+0

は通常、 'タイプ間の論理的または(^)演算子を使用して排他的な労働組合を許可します。 'OR'はインクルーシブで、' XOR'は排他的です。あなたは自分自身が「OR」だと言うので、ここでは「XOR」が使用されると思うのはなぜか分かりません。私は排他的な組合を持つことでこの効用を見ることができますが、包括的な組合はより頻繁に役に立つと思います。文字列を取る機能を持つ既存のJavaScriptライブラリ、または要素を考えてみましょう。うまくいけば、私がリンクしているgithubの問題にあなたのサポートを追加することは、その機能にどれだけの興味があるかを示すのに役立ちます。 – AndyJ

答えて

3

連合型は現在のところ包括的です。つまり、いずれかの条件が真であれば、それは一致します。

排他的なユニオンを作成することは現在できません。

あなたが強く望む機能であれば参加したいかもしれない排他的な組合を追加することについて議論しているオープンissueがあります。

提案:| ``意味OR`は、と `^` XORを意味#14094