Задать вопрос
@Incold

Почему неправильно формируется тип?

Здравствуйте! Столкнулся с проблемой типизации компоненты
Типизация пропсов компоненты:
// Основная проблема в этом типе
type FunctionParams<U> = U extends undefined
  ? {
      page: number;
      limit: number;
    }
  : {
      page: number;
      limit: number;
    } & U;

interface IProps<T, U> {
  queries?: U;
  getList: (
    props: FunctionParams<U>
  ) => AxiosPromise<IAxiosPaginatedResponse<T>>;
  ...
}


Пример вызова:
const filters = {
   search:  '';
   city: 1;
 };
  <Pagination
       getList={getList}
       queries={filters}
       ...
   />


Функция getList:
export const getList = (props: {
  page: number;
  limit: number;
  search: string;
  city: number;
}): AxiosPromise<IAxiosPaginatedResponse<IListItem>> => {
  return ...
};


Задача состоит в том, чтобы совпадало количество (и типы) пропсов передаваемых в функцию, т.е. в рамках примера, чтобы в queries обязательно передавалось search и city, иначе выкидывать ошибку
Однако при передаче лишнего свойства в queries или если закоментить передачу queries, ошибка не появляется, вместо этого (в ide) тип пропса getList преобразуется в вид:
Если не передавать queries
(props: ({page: number, limit: number} & {page: number, limit: number, search: string, city: number}) => ...

Если передать в queries лишнее свойство, например, newProp: string
(props: ({page: number, limit: number} & {newProp: string, search: string, city: number}) => ...


Почему в первой ошибке не срабатывает условный тип (если U автоматически формирует тип из параметров функции, то как этого избежать, другими словами, как правильно написать проверку), а во второй не ругается на лишнее свойство?

Заранее, спасибо, за любую помощь!
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Средний 15 комментариев
Решения вопроса 1
WblCHA
@WblCHA
После множество итераций совместно с Aetae мы пришли к такому относительно красивому решению:
https://www.typescriptlang.org/play?keyofStringsOn...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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