prettier/tests/type_param_defaults/classes.js

66 lines
1.9 KiB
JavaScript

/* @flow */
class A<T> {
p: T;
constructor(p: T) {
this.p = p;
}
}
// Test out simple defaults
class B<T = string> extends A<T> {}
var b_number: B<number> = new B(123);
var b_void: B<void> = new B();
var b_default: B<> = new B('hello');
var b_star: B<*> = new B(123);
(b_number.p: boolean); // Error number ~> boolean
(b_void.p: boolean); // Error void ~> boolean
(b_default.p: boolean); // Error string ~> boolean
(b_star.p: boolean); // Error number ~> boolean
class C<T: ?string = string> extends A<T> {}
var c_number: C<number> = new C(123); // Error number ~> ?string
var c_void: C<void> = new C();
var c_default: C<> = new C('hello');
var c_star: C<*> = new C('hello');
(c_void.p: boolean); // Error void ~> boolean
(c_default.p: boolean); // Error string ~> boolean
(c_star.p: boolean); // Error string ~> boolean
class D<S, T = string> extends A<T> {}
var d_number: D<mixed, number> = new D(123);
var d_void: D<mixed, void> = new D();
var d_default: D<mixed> = new D('hello');
var d_too_few_args: D<> = new D('hello'); // Error too few tparams
var d_too_many: D<mixed, string, string> = new D('hello'); // Error too many tparams
var d_star: D<*> = new D(10); // error, number ~> string
(d_number.p: boolean); // Error number ~> boolean
(d_void.p: boolean); // Error void ~> boolean
(d_default.p: boolean); // Error string ~> boolean
(d_star.p: boolean); // Error number ~> boolean
class E<S: string, T: number = S> {} // Error: string ~> number
class F<S: string, T: S = number> {} // Error: number ~> string
class G<S: string, T = S> extends A<T> {}
var g_default: G<string> = new G('hello');
(g_default.p: boolean); // Error string ~> boolean
class H<S = T, T = string> {} // Error - can't refer to T before it's defined
class I<T: ?string = *> extends A<T> {}
var i_number: I<number> = new I(123); // Error number ~> ?string
var i_void: I<void> = new I();
var i_default: I<> = new I('hello');
var i_star: I<*> = new I('hello');