Considere o seguinte pseudo-TypeScript, onde Class
denota algo parecido com um construtor:
function convert<C extends Class>(
stuff: unknown,
mappers: [Mapper<unknown, parameter i of constructor C>],
c: constructor of C
): C {
return c(...mappers.map((f) => f(stuff))
}
A ideia é que cada um mapper
extraia um parâmetro do construtor stuff
e a tupla de resultado seja passada ao construtor.
Nesta forma simples seria um tanto bobo, pois eu sempre poderia chamar o construtor como new C(map1(stuff), map2(stuff), ...)
em vez de chamar esta construção elaborada. Mas uma vez que eu tenha o acima, eu quero adicionar tratamento de erro para os mapeadores de forma que o construtor seja chamado somente se nenhum tiver um problema.
O que tenho até agora:
type Class = abstract new (...args: any) => any;
type Func<A, C> = (a: A) => C;
type FuncTuple<A, TUP> = { [P in keyof TUP]: Func<A, TUP[P]> };
type ParamFuncTuple<A, C extends Class> = FuncTuple<A, ConstructorParameters<C>>;
function boo<C extends Class>(
text: unknown,
funcs: ParamFuncTuple<unknown, C>,
c: Class
) {
const params = funcs.map((f) => f(text))
}
Aqui o compilador diz const params
has type any[]
o que não é muito promissor. Isso é possível?