Задать вопрос
@awenn2015
Веб-программист самоучка

Как нормально перегрузить функцию?

Приветствую всех, имеется потребность перегрузить функцию как например в kotlin, есть такой код:

type DispatchKey<T> = keyof T;
type DispatchValue<T> = T[DispatchKey<T>];
type InitialState<T> = T | (() => T);

interface Dispatch<T> {
  (key: DispatchKey<T>, value: DispatchValue<T>): void;
  (keys: (DispatchKey<T>)[], iterator: (key: DispatchKey<T>) => DispatchValue<T>): void;
}

export default function useDispatch<T extends {}>(initialState: InitialState<T>): [T, Dispatch<T>] {
  const [state, setState] = useState(initialState);

  function dispatch(key: DispatchKey<T>, value: DispatchValue<T>) {
    setState((prev) => ({
      ...prev,
      [key]: value,
    }));
  }

  function dispatch(keys: (DispatchKey<T>)[], iterator: (key: DispatchKey<T>) => DispatchValue<T>) {
    setState((prev) => {
      const updated = keys.map((key) => iterator(key))
      console.log(updated);
      return prev
    });
  }

  return [state, dispatch];
}


так вот, нужно перегрузить dispatch что бы это были 2 отдельные функции,
я сомневаюсь что нормально будет проверять параметр через всякие if, больно странное занятие да и не особо красиво тогда будет, надеюсь что в typescript вообще можно так перегружать функции как в языках со статической типизацией, буду рад любому ответу
  • Вопрос задан
  • 69 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@awenn2015 Автор вопроса
Веб-программист самоучка
В таком случае проще вовсе разные функции сделать чем заниматься такой ерундой с проверками типов, это даже перегрузкой не назовешь
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
К сожалению, в TypeScript придётся проверять через if.
function dispatch<T>(key: DispatchKey<T>, value: DispatchValue<T>): void;
function dispatch<T>(keys: DispatchKey<T>[], iterator: (key: DispatchKey<T>) => DispatchValue<T>): void;
function dispatch<T>(
    keyOrKeys: DispatchKey<T> | DispatchKey<T>[],
    valueOrIterator: DispatchValue<T> | ((key: DispatchKey<T>) => DispatchValue<T>)
): void {
    if (Array.isArray(keyOrKeys) && typeof valueOrIterator === 'function') {
        setState((prev) => {
            const updated = keyOrKeys.map((key) => valueOrIterator(key));
            console.log(updated);
            return prev;
        });
    } else {
        setState((prev) => ({
            ...prev,
            [keyOrKeys]: valueOrIterator,
        }));
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы