typescript - typen 'any' kan inte tilldelas typen 'never'


Jag använder (tror jag) en "indexåtkomstparameter" för att skriva till ett objekt i min 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;
  }
}

Jag får ett fel på newState[action.parameter]=action.value som säger "Typ 'any' kan inte tilldelas typ 'never'".

Jag ser här (under "Fixes to unsound writes to indexed access types") att detta faktiskt förväntas i TypeScript. Det står att lösningen är "Om du är övertygad om att du inte hanterar ett fel, kan du istället använda en typangivelse."

Jag har försökt att lägga till

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

och ändra raden till

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

såväl som

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

men jag får samma fel, bara med en annan typ som inte kan tilldelas till never.

Finns det ett sätt att göra denna parameteråtkomst utan att helt enkelt använda @ts-ignore?

Svar #1

I mitt fall felet:

typen 'any' kan inte tilldelas typen 'never'

Orsaken var helt enkelt ett fält som inte var korrekt deklarerat (med en specifik typ). Därför löste jag det genom att ändra dess deklaration, t.ex. från:

myArray: [];

Till :

myArray: any[];

Svar #2

Du har ingen indexsignatur på typen. Men! Det är okej, för det finns ett annat sätt att ta itu med detta: Ett beräknat egenskapsnamn:

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

Beroende på definitionen av ParameterName bör det åtgärda problemet. Till exempel, om ParameterName är keyof SettingsState, kommer det att göra det.

Live på lekplatsen (använder type ParameterName=keyof SettingsState;)

Relaterade artiklar