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ć.