type ReturnType < T > = T extends ( ... args : any [ ] ) => infer R ? R : T ; type TmpType = ReturnType < ( ) => number > ; type ConcatReturn = ReturnType < Array < number > [ "concat" ] > ; type DateType = ReturnType < Date > ; const tmp = ( false as true ) && [ 1 ] . concat ( [ 2 ] ) ; type ConcatReturnOld = typeof tmp ; { type SecondArg < T > = T extends ( a : string , b : infer R ) => void ? R : never ; type TmpType = SecondArg < ( a : string , b : boolean ) => void > ; } { type FooParamType < T > = T extends { Foo : infer R ; } ? R : never ; type TmpType1 = FooParamType < { Foo : RegExp ; } > ; type TmpType2 = FooParamType < { Bar : RegExp ; } > ; } { type InstanceType < T > = T extends { new ( ... args ) : infer R ; } ? R : never ; type DateInstance = InstanceType < typeof Date > ; } export { } ;