typescript reselect createSelector No overload matches this call OutputSelector ParametricSelector
Primary tabs
No overload matches this call.
The last overload gave the following error.
Type 'OutputSelectorstring>' is not assignable to type 'ParametricSelector '.
Type 'string' is not assignable to type 'boolean'.ts(2769),
Возможная причина
Это интересно, но причина ( в нашем случае на момент написания данной заметки) в том, что использовалось более 12 селекторов, что не соответствует описаниям типов сигнуры функции createSelector() (см. опреление типов для createSelector() в исходном коде reselect)
ПРИМЕЧАНИЕ: использовать более 12 селекторов можно, если все они возвращают один и тот же тип данных.
Демонстрация ошибки
Пример кода:
import { createSelector } from '@reduxjs/toolkit';
type UserInfo = {
name: string,
active: boolean
items: string[]
}
type RootState = {
user: UserInfo
}
export const initialState: UserInfo = {
name: '',
items: [],
active: true
};
const selectDomain = (state: RootState) => state?.user || initialState;
const selectUserName = createSelector([selectDomain], ({ name }) => name);
const selectIsActive = createSelector([selectDomain], ({ active }) => active);
const selectDemo1 = createSelector([selectDomain], ({ name }) => name);
const selectUserInfo = createSelector([selectUserName,
selectIsActive,
selectDemo1,
selectDemo1,
selectDemo1,
selectDemo1,
selectDemo1,
selectDemo1,
selectDemo1,
selectDemo1,
selectDemo1,
selectDemo1,
selectDemo1, ],
(name, active ) => `${name} ${active}`);
Решение
В данный момент решение является перекобинация селекторов, так чтобы конкретный селектор не зависел более чем от 12 своих "товарищей"))
Какие есть варианты (два, в целом это та же перегруппировка):
- Спускать текущему комноненту "лишние" данные как пропсы из вышестоящего компонента-обертки
- Попытаться завернуть "лишние" селекторы в более общий селектор, так чтобы число входных селекторов уменьшилось за счет группировки
- Log in to post comments
- 1960 reads