类型“ any”不能分配给类型“ never”

时间:2019-11-12 16:59:47

标签: typescript redux

我正在使用(我认为)“索引访问参数”来写入我的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'不能分配给类型'从不'”。

我看到here(在“修复对索引访问类型的不正确写入中”)下,这确实是TypeScript所期望的。它说解决方案是“如果您确信自己没有在处理错误,则可以改用类型断言。”

我尝试添加

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来进行此参数访问?

2 个答案:

答案 0 :(得分:1)

您的类型上没有index signature。但!没关系,因为还有另一种方法可以给这只猫换皮:计算所得的属性名称:

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

根据ParameterName的定义,可以解决此问题。例如,如果ParameterNamekeyof SettingsState,它将为

Live on the playground(使用type ParameterName = keyof SettingsState;

答案 1 :(得分:0)

在我的情况下,错误:

类型'any'不能分配给类型'从不

仅是由于数组未正确声明(具有特定类型)引起的。因此,我通过更改其声明来解决它,例如来自:

myArray: [];

收件人:

myArray: any[];