/* @flow */

type Foo = interface {
  a: string;    // exists in TestClass
  b: string;    // doesn't exist
  c?: ?string;  // exists in TestClass, optional
  d?: number;   // doesn't exist
}

class TestClass {
  a: string;
  c: ?string;
}

var x = new TestClass();

x.a; // ok
x.b; // error, TestClass has no b
x.c; // ok
x.d; // error, TestClass has no d

var y : Foo = x;
y.b; // error, doesn't exist in TestClass
y.d; // ok, it's optional

class Test2Superclass {
  a: number;  // conflicts with cast to Foo
  c: ?number; // conflicts with cast to Foo
}
class Test2Class extends Test2Superclass {
  b: number;  // conflicts with cast to Foo
}

var z = new Test2Class();
var w : Foo = z;
