Załóżmy, że chcę zrobić sobie funkcję, która przyjmuje listę funkcji i losowo dobiera sobie jedną z nich i zwraca jej wynik.

type Fn<T> = () => T;

const rand = <T>(...fns: Fn<T>[]): T => {
    return fns[0](); // normalnie byśmy tu chcieli maszynę losującą :)
}

const result = rand(() => 5, () => "s"); // tu chciałbym, żeby TS zamiast krzyczeć sam ogarnął możliwe typy - w tym momencie wywala się na `"s"` z komunikatem: TS2322: Type 'string' is not assignable to type 'number'.

// Natomiast jeżeli wcześniej przygotuję sobie arraya i ręcznie podam listę możliwych typów - to jest ok
const customFns: Fn<string | number>[] = [() => 5, () => "s"];
const result2 = rand(...customFns); // spoczko, ts rozumie, że `result2` bedzie stringiem albo numberem, nie krzyczy

Jak tego dokonać? Powyższy kod to najlepsze, co udało mi się uzyskać.