type A<T = string> = T;
type A<T = *> = T;
type A<T: ?string = string> = T;
type A<S, T: ?string = string> = T;
type A<S = number, T: ?string = string> = T;

class A<T = string> {}

class A<T: ?string = string> {}

class A<S, T: ?string = string> {}

class A<S = number, T: ?string = string> {}

(class A<T = string> {});

(class A<T: ?string = string> {});

(class A<S, T: ?string = string> {});

(class A<S = number, T: ?string = string> {});

declare class A<T = string> {}
declare class A<T: ?string = string> {}
declare class A<S, T: ?string = string> {}
declare class A<S = number, T: ?string = string> {}
interface A<T = string> {}
interface A<T: ?string = string> {}
interface A<S, T: ?string = string> {}
interface A<S = number, T: ?string = string> {}