Идентификатор свойства не существует в типе 'never'

63
6

Я пытаюсь сделать .map функцию в массив состояний в Redux с TypScript, проблема в том, что она бросает ошибку

[ts] Свойство 'id' не существует в типе 'never'

в landing.id if, поскольку его массив объектов имеет смысл для меня, но кажется, что я чего-то не хватает

export default function landingReducer (state = [], action) {
switch(action.type) {
case ActionTypes.ADD_LANDING:
return [...state, action.landing]
case ActionTypes.EDIT_LANDING:
return state.map(landing => {
if (action.landing.id == landing.id) {
return landing;
}
})

Заранее спасибо!

спросил(а) 2021-01-25T12:07:12+03:00 5 месяцев назад
1
Решение
77

Вероятно, это связано с отсутствием типов для аргументов state и/или action. Попробуйте этот код, который должен работать с TypeScript 2. 4+, вдохновленный этой статьей:

interface Landing {
id: any;
}

enum ActionTypes {
ADD_LANDING = "ADD_LANDING",
EDIT_LANDING = "EDIT_LANDING",
OTHER_ACTION = "__any_other_action_type__"
}

interface AddLandingAction {
type: ActionTypes.ADD_LANDING;
landing: Landing;
}

interface EditLandingAction {
type: ActionTypes.EDIT_LANDING;
landing: Landing;
}

type LandingAction =
| AddLandingAction
| EditLandingAction;

function landingReducer(state: Landing[], action: LandingAction) {
switch (action.type) {
case ActionTypes.ADD_LANDING:
return [...state, action.landing]

case ActionTypes.EDIT_LANDING:
return state.map(landing => {
if (action.landing.id === landing.id) {
return landing;
}
});
}
}

ответил(а) 2021-01-25T12:07:12+03:00 5 месяцев назад
46

В вашем коде отсутствуют скобки и другой необходимый импорт, что затрудняет быстрое воспроизведение и диагностику кого-то другого.

При этом TypeScript вводит параметр state как тип пустого литерала [], который считается never[], что означает, что он всегда будет пустым. Таким образом, функция map не работает, потому что landing выводится как невозможное значение (never существует допустимых значений типа).

Если вы хотите, чтобы исправить это, вы должны сказать машинопись, какой массив state, вероятно, будет. Быстро исправить, чтобы сделать это массив any:


... function landingReducer (state: any[] = [], action) ...

В идеале вы должны добавить к своим параметрам более конкретные типы, чтобы TypeScript мог помочь вам уловить ошибки (как вы знаете, что action имеет свойство type?).

Надеюсь, это поможет; удачи!

ответил(а) 2021-01-25T12:07:12+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема