Tienes una librería de TypeScript que hace tiempo nadie actualiza, el código se ha vuelto un mamotreto y mantenerlo es un dolor de cabeza.

El truco

Antes, con any:

function processData(input: any): any {
    // procesar datos
    return input.data.map((item: any) => item * 2);
}

Después, con mejor tipado y genéricos:

interface DataItem {
    value: number;
}

function processData<T extends DataItem>(input: { data: T[] }): number[] {
    return input.data.map(item => item.value * 2);
}

El truco está en dejar de usar any y aplicar tipado explícito y genéricos. Definimos una interfaz DataItem para especificar que cada elemento tiene una propiedad value de tipo number. Usamos generics para hacer la función más flexible y segura, permitiendo que procesemos arrays de objetos que extiendan DataItem.

Aunque el código legacy sea un rompecabezas, aplicar mejores prácticas de TypeScript lo convierte en una joya mucho más mantenible y sostenible.