type foo = ?(a | b);
type foo2 = ?(a & b);
type foo3 = (a | b)[];
type foo4 = (a & b)[];
type foo5 = a | b | c;
type foo6 = a & b & c;
type foo7 = (a & b) | c;
type foo8 = a | (b & c);
type foo9 = a & (b | c);
type foo10 = (a | b) & c;