@frogqwetr

Как правильно протипизировать createSelector с аргументом?

У меня есть селектор, - selectFieldActiveRoomMarker, в котором есть другой селектор, получающий активный маркер с типом RoomMarkerData, и в котором есть динамически передаваемый аргумент - название поля. Проблема заключается в том, что вызывая этот селектор в компоненте, используя useSelector хук и передавая название поля, я получаю тип не конкретного поля, а объединение всех полей объекта. Например, я хочу получить поле 'id', типом которого является number, и хочу увидеть в переменной 'field' тип равный 'number' | 'undefined', но по факту я получаю 'number' | 'string' | 'undefined'. (См. код в компоненте).

// Селекторы и типы
type RoomMarkerData = {
  id: number,
  title: string
}

type FieldsRoomMarkerData = keyof RoomMarkerData

selectFieldActiveRoomMarker = createSelector(
  [
    selectActiveRoomMarker,
    (state, field: FieldsRoomMarkerData) => field,
  ],
  (activeRoomMarker, field) => (
    activeRoomMarker && activeRoomMarker[field]),
)


// Получение поля в компоненте
const field = useAppSelector((state) => (
    selectFieldActiveRoomMarker(state, 'id')
  ))
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
WblCHA
@WblCHA
Может красивее и можно сделать, но в голову ничего не пришло. Разве что типы для крейтСелектора переписать, но это просто удачи.)
https://www.typescriptlang.org/play?#code/JYWwDg9g...
В любом случае, это, пожалуй, наименее геморройный и универсальный вариант.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы