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> {}
type A<T = void> = T
