TypeScript报错{ identifier: string; }不可分配给ConcatArray<never>如何解决?
报错根因
你定义的initialArticleState中analysers的初始值为空数组[],TypeScript 无法自动推导该数组的元素类型,默认会将其推导为never[]类型。never类型代表不可能存在的值,因此往never[]类型的数组中拼接任何类型的元素都会触发类型不匹配的报错。
解决方法
方法1:给状态显式定义完整接口(最推荐)
先定义 reducer 对应状态的类型结构,再给初始值绑定该类型,TS 就能正确识别数组的元素类型:
interface Update_AnalyserState { identifier: string; } // 新增state类型定义 interface ArticleState { analysers: Update_AnalyserState[] } // 给初始值指定类型 const initialArticleState: ArticleState = { analysers: [], }; export function articleReducer( state = initialArticleState, action: articleReducerAction ) { switch (action.type) { case ActionType.UPDATE_ANALYSER: return { ...state, analysers: state.analysers .filter(a => a.identifier != action.payload.identifier) .concat(action.payload), }; } }
这种写法后续所有对 state 的操作都会有完整的类型校验和提示,可维护性最高。
方法2:直接给空数组断言类型
如果不想单独定义 state 接口,也可以直接给初始空数组指定元素类型:
const initialArticleState = { analysers: [] as Update_AnalyserState[], };
这种写法更简洁,适合简单状态的场景。
优化建议
建议你给articleReducerAction联合类型中的UPDATE_ANALYSER对应 action 显式定义 payload 类型,确保传入的 payload 结构符合Update_AnalyserState的要求,避免运行时出现结构不匹配的问题:
interface UpdateAnalyserAction { type: typeof ActionType.UPDATE_ANALYSER payload: Update_AnalyserState } // 将上述类型合并到你的articleReducerAction联合类型中即可
内容的提问来源于stack exchange,提问作者user10727450
相关产品推荐
相关产品推荐

