1
特定の条件に基づいて複数のメンバータイプを指定できますか? 他のメンバータイプに基づく条件付きメンバータイプ
value
がタイプboolean
またはDate
であり、その後options
がタイプundefined
でなければなりません:私はあればあることを指定したいinterface DataItem { value: boolean | Date | string | string[]; options: undefined | string[]; }
:たとえば、次の型を与えます。
value
を次にoptions
をタイプstring[]
でなければならないタイプstring
又はstring[]
です。
現在、TypeScript(2.2)の現行バージョンで上記の制約を指定する方法はありますか?ある場合にも、私はすなわち、一方の部材に型ガードを追加すると、他のメンバーに適用されるべきであると仮定しています:
let data: DataItem;
if (typeof data.value === 'boolean') {
data.options = ['a']; // => Error Type 'string[]' is not assignable to type 'undefined'.
}
を私は次のことを試してみましたが、それは動作しませんでした:
interface BooleanOrDateItem {
value: boolean | Date;
}
interface StringOrStringArrayDataItem {
value: string | string[];
options: string[];
}
type DataItem = BooleanOrDateItem | StringOrStringArrayDataItem;
let data: DataItem;
if (typeof data.value === 'string') {
// I would expect this to work but the compiler complains
// => Property 'options' does not exist on type 'DataItem'.
// Property 'options' does not exist on type 'BooleanOrDateItem'.
data.options = ['a'];
}
は、明示的に
if (typeof data.value === 'string') {
(<StringOrStringArrayDataItem>data).options = ['a'];
}
に動作しますが、コンパイラはその上のやるべきではない、明らかにStringOrStringArray
にキャストdata
はStringOrStringArrayDataItem
であると推測するのに十分な情報があるので私の代わりに?
私はこのアプローチがうまくいかないと感じています。私は「任意の」データ型を使用したり、複数のインターフェイスを作成したり、工場を利用して作業する必要があります。 –