To break this down:
interface IControllerDetails {
controller : { new(...args:string[]): void ;};
}
Let's start here
interface IControllerDetails {
This declares a type called IControllerDetails
controller : { new(...args:string[]): void ;};
~~~~~~~~~~
It has a property called controller
controller : { new(...args:string[]): void ;};
~ ~
The type of the controller property is an object type with some members. There could have been more properties declared between the {}s, but there's only one here
controller : { new(...args:string[]): void ;};
~~~
The only member of the controller property is a construct signature. This means you can invoke the new operator on the controller property.
controller : { new(...args:string[]): void ;};
~~~ ~~
This constructor takes between zero and infinity arguments.
controller : { new(...args:string[]): void ;};
~~~~
The name of the parameter list is args, though this doesn't affect anything.
controller : { new(...args:string[]): void ;};
~~~~~~
All of the arguments have to be of type string
controller : { new(...args:string[]): void ;};
~~~~
The constructor doesn't have to return anything. In practice, what they're saying here is that you can return an object of any kind (because it's safe to assign a function returning more to a function returning less).