redux 型别'any'无法指派给型别'never'

avkwfej4  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(184)

我正在使用(我认为)一个“索引访问参数”写入我的reducer中的一个对象:

export type SettingsState = {
    brainRadiusEstimate: number,
    displayProgressIndicator: boolean,
    respiratoryFilterUpperBound: string,
    patientFeedback: PatientFeedbackType,
    connectionStatus: ConnectionStatus,
    brainSize: BrainSize,
    version: 'BETA 2',
}

export type ChangeParameterAction = {
    type: 'CHANGE_PARAMETER',
    parameter: ParameterName,
    value: any
}

export default function settingsReducer(state: SettingsState = defaultState, action: ChangeParameterAction): SettingsState {
  switch (action.type) {
    case 'CHANGE_PARAMETER':
      const newState: SettingsState = { ...state };
      newState[action.parameter] = action.value;
      return newState;
    default:
      return state;
  }
}

我在newState[action.parameter] = action.value上收到一个错误,显示“类型'any'不能赋值给类型'never'”。
我看到here(在“修复对索引访问类型的不健全写入”下),这确实是TypeScript中所期望的。它说解决方案是“如果你确信你没有处理错误,你可以使用类型Assert来代替。”
我试过添加

type ValueTypes = number | string | boolean | null | PatientFeedbackType | ConnectionStatus | BrainSize | 'BETA 2

并将该行更改为

newState[action.parameter] = action.value as ValueTypes;

以及

const value: ValueTypes = action.value
newState[action.parameter] = value;

但我得到了同样的错误,只是使用了一个不能赋值为never的不同类型。
有没有办法不使用@ts-ignore就可以访问这个参数?

7fyelxc5

7fyelxc51#

你没有类型的索引签名。但是!这没关系,因为还有另一种方法可以剥这只猫的皮:计算属性名称:

const newState: SettingsState = { ...state, [action.parameter]: action.value };

根据ParameterName的定义,这应该可以解决问题。例如,如果ParameterNamekeyof SettingsState,它就可以。
现场操场(使用type ParameterName = keyof SettingsState;

93ze6v8z

93ze6v8z2#

在我的情况下错误:
类型**'any'不能赋给类型'never'**
只是由于一个数组没有正确声明(使用特定类型)而导致的。因此,我通过更改其声明来解决此问题,例如:

myArray: [];

收件人:

myArray: any[];
ecr0jaav

ecr0jaav3#

const [array, setArray] = useState<any>([])

相关问题