TypeScript开发:重构Redux store遇'type'隐式any类型报错,如何为其指定string类型
报错根因
该报错是TypeScript开启noImplicitAny严格检查规则的典型触发场景:当函数参数未做显式类型标注时,从参数中解构出的所有成员都会被判定为隐式any类型,直接触发类型检查拦截。
具体实现方式
TypeScript对解构形式的参数做类型标注时,类型注解需要作用于整个被解构的对象整体,不能单独给解构出来的type变量直接加类型,常用的实现有两种:
- 抽离公共接口定义,适合需要在多个场景复用动作类型的场景:
// 定义动作规范:type字段固定为字符串类型,其余任意扩展字段会被...rest正常收集 interface ReducerAction { type: string; [key: string]: unknown; } const changeState = (state = initialState, { type, ...rest }: ReducerAction) => { switch (type) { case "set": return { ...state, ...rest }; case "alert": return { ...state, toasts: [...state.toasts, rest] }; default: return state; } }; - 行内声明类型注解,适合类型逻辑简单、无需跨文件复用的临时场景:
const changeState = (state = initialState, { type, ...rest }: { type: string; [key: string]: unknown }) => { // 原有业务逻辑完全不需要改动 switch (type) { case "set": return { ...state, ...rest }; case "alert": return { ...state, toasts: [...state.toasts, rest] }; default: return state; } };
常见踩坑提醒
- 禁止把类型注解写在解构对象内部,比如写法
{ type: string, ...rest }属于语法误用:TypeScript会将这段代码解析为对象属性的类型声明,而非参数的类型标注,会直接抛出语法错误。所有解构参数的类型注解,都要跟在解构结构的右大括号外侧,和普通参数的类型标注位置保持逻辑一致。 - 必须给动作类型加上
[key: string]: unknown索引签名,匹配...rest的收集逻辑。如果不加这个索引签名,TypeScript会判定rest为无任何属性的空对象,后续读取rest内的字段时会触发新的类型报错。
内容的提问来源于stack exchange,提问作者Nick McLean
相关产品推荐
相关产品推荐

