Как менять тип относительно входящих данных? typescript

Рейтинг: 0Ответов: 1Опубликовано: 23.03.2023

В функцию onChange приходит переменная dates зависящая от атрибута selectsRange (reactDatePicker). Если selectsRange === true в dates приходит массив с 2-мя Date, а без просто Date.

type IOnChangeRange = [Date | null, Date | null]
type IOnChangeSingle = Date | null

Я пытался сделать так, но так не работает. Работает только по отдельности.

  const onChange = (dates: IOnChangeRange | IOnChangeSingle) => {
    if(selectsRange){
      const [start, end] = dates;
      setStartDate(start);
      setEndDate(end);
    } else {
      setStartDate(dates);
    }
  };

Подскажите как сделать правильно прописать типы. Выходит ошибка на строке: const [start, end] = dates;:

Type 'IOnChangeRange | IOnChangeSingle' is not an array type.

и на строке setStartDate(dates):

Argument of type 'IOnChangeRange | IOnChangeSingle' is not assignable to parameter of type 'SetStateAction<Date | null>'.
  Type 'IOnChangeRange' is not assignable to type 'SetStateAction<Date | null>'.
    Type '[Date | null, Date | null]' is not assignable to type 'Date'.

Ответы

▲ 0Принят

Нашел такое решение. Не знаю на сколько это правильно, но сработало.

const onChange = (dates: IOnChangeRange | IOnChangeSingle) => {
    if(Array.isArray(dates)){
      const [start, end] = dates;
      setStartDate(start);
      setEndDate(end);
    } else {
      setStartDate(dates);
    }
  };