/** * Test strict type param arity checking. * * Full type argument lists are required in type expressions, * such as type annotations and interface extends clauses. * Type arguments are optional in value expressions, such as * class extends clauses and calls of polymorphic functions. * * @flow */ // arity error in type annotation using polymorphic class class MyClass { x: T; constructor(x: T) { this.x = x; } } var c: MyClass = new MyClass(0); // error, missing argument list (1) // arity error in type annotation using polymorphic class with defaulting class MyClass2 { x: T; y: U; constructor(x: T, y: U) { this.x = x; this.y = y; } } var c2: MyClass2 = new MyClass2(0, ""); // error, missing argument list (1-2) // arity error in type annotation using polymorphic type alias type MyObject = { x: T; } var o: MyObject = { x: 0 }; // error, missing argument list // arity error in type alias rhs type MySubobject = { y: number } & MyObject; // error, missing argument list // arity error in interface extends interface MyInterface { x: T; } interface MySubinterface extends MyInterface { // error, missing argument list y: number; } // *no* arity error in extends of polymorphic class class MySubclass extends MyClass { // ok, type arg inferred y: number; constructor(y: number) { super(y); } } // *no* arity error in call of polymorphic function function singleton(x: T):Array { return [x]; } var num_array:Array = singleton(0); // ok, type arg inferred