No exemplo simplificado a seguir do meu problema:
const factory = <T extends unknown[]>(
fn: (...args: T) => void
) => {
const transformedFn = (...args: T) => {
console.log('called with', ...args)
return fn(...args)
}
// init
transformedFn() // TypeScript error here
return transformedFn
}
// usage:
const fn = (num?: number, str?: string) => {
return JSON.stringify({ num, str })
}
factory(fn)()
Recebo o erro TypeScript:
O argumento do tipo '[]' não é atribuível ao parâmetro do tipo 'T'. '[]' é atribuível à restrição do tipo 'T', mas 'T' pode ser instanciado com um subtipo diferente da restrição 'unknown[]'.
Confusamente, isso funciona:
const fn = <T extends unknown[]>(...args: T) => {
return args
}
fn()
Como posso convencer o TypeScript de que é o mesmo T
em ambos os casos?