I believe this should work:
struct A(alias Exc) {
alias ExceptionType = Exc;
}
alias TT(Args...) = Args;
alias X = TT!(A!Throwable());
alias Y = X[0].ExceptionType;
But it produces the following ICE:
dmd: dsymbol.c:484: Dsymbol* Dsymbol::takeTypeTupleIndex(Loc, Scope*, Dsymbol*, RootObject*, Expression*): Assertion `o->dyncast() == DYNCAST_DSYMBOL' failed.
Replacing the last line by the following makes it work:
auto z = X[0];
alias Y = z.ExceptionType;