我正在使用(我认为)一个“索引访问参数”写入我的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
就可以访问这个参数?
3条答案
按热度按时间7fyelxc51#
你没有类型的索引签名。但是!这没关系,因为还有另一种方法可以剥这只猫的皮:计算属性名称:
根据
ParameterName
的定义,这应该可以解决问题。例如,如果ParameterName
是keyof SettingsState
,它就可以。现场操场(使用
type ParameterName = keyof SettingsState;
)93ze6v8z2#
在我的情况下错误:
类型**'any'不能赋给类型'never'**
只是由于一个数组没有正确声明(使用特定类型)而导致的。因此,我通过更改其声明来解决此问题,例如:
收件人:
ecr0jaav3#