module X { export enum Foo { A, B } } module Y { export enum Foo { A, B } } module Z { export enum Foo { A = 1 << 1, B = 1 << 2, } } module Ka { export enum Foo { A = 1 << 10, B = 1 << 11, } } const e0: X.Foo | boolean = Y.Foo.A; // ok const e1: X.Foo | boolean = Z.Foo.A; // not legal, Z is computed const e2: X.Foo.A | X.Foo.B | boolean = Z.Foo.A; // still not legal const e3: X.Foo.B | boolean = Z.Foo.A; // not legal const e4: X.Foo.A | boolean = Z.Foo.A; // not legal either because Z.Foo is computed and Z.Foo.A is not necessarily assignable to X.Foo.A const e5: Ka.Foo | boolean = Z.Foo.A; // ok