class A { } new A; // OK, implicitly inferred type args class B extends A { } // OK, same as above function foo(b): A { // ok but unsafe, caller may assume any type arg return b ? (new A: A): (new A: A); } function bar(): A<*> { // error, * can't be {} and {x: string} at the same time return (new A: A<{}>) || (new A: A<{x: string}>); }