本页介绍如何将 TypeScript 与 Redux 应用程序集成,以提供类型安全性和改进的开发体验。它解释了为 Redux 存储、动作、reducer 以及与 Redux 状态交互的 React 组件进行类型定义的推荐模式。
有关如何将 TypeScript 添加到项目设置的信息,请参阅项目结构和组织。
在 Redux 中使用 TypeScript 具有以下几个主要优势:
来源:docs/usage/UsageWithTypescript.md, docs/tutorials/typescript.md
使用 TypeScript 设置存储的推荐方法包括:
configureStore 创建存储来源:docs/usage/UsageWithTypescript.md:49-76, docs/tutorials/essentials/part-3-data-flow.md:205-231
来源:docs/usage/UsageWithTypescript.md:49-74, docs/tutorials/typescript.md:42-61
创建预类型化的 React-Redux Hooks,以简化组件中的类型定义
来源:docs/usage/UsageWithTypescript.md:77-116, docs/tutorials/typescript.md:62-79
这种方法消除了每次使用 useSelector 时都必须指定 RootState 类型,并确保 useDispatch 正确处理 thunk 和其他中间件。
在使用 Redux Toolkit 的 createSlice 定义一个 Slice 时,您应该:
PayloadAction<T> 来类型化动作负载来源:docs/usage/UsageWithTypescript.md:122-170, docs/tutorials/essentials/part-3-data-flow.md:275-290
来源:docs/usage/UsageWithTypescript.md:122-182
Redux thunks 需要正确的类型定义,以确保整个异步流程的类型安全
来源:docs/usage/UsageWithTypescript.md:226-270, docs/tutorials/essentials/part-5-async-logic.md:226-249
createAsyncThunkRedux Toolkit 的 createAsyncThunk 简化了异步操作的类型定义
来源:docs/usage/UsageWithTypescript.md:265-302, docs/tutorials/essentials/part-5-async-logic.md:266-297
来源:docs/tutorials/essentials/part-5-async-logic.md:402-517
在 React 组件中利用类型化 Hooks
来源:docs/usage/UsageWithTypescript.md:326-351, docs/tutorials/typescript.md:151-183
用于从 Redux 存储中选择数据
来源:docs/tutorials/essentials/part-4-using-data.md:475-526
在使用 createEntityAdapter 处理规范化状态时
来源:docs/tutorials/essentials/part-6-performance-normalization.md
RTK Query 对 TypeScript 提供了第一类支持
来源:docs/tutorials/essentials/part-7-rtk-query-basics.md:156-183, docs/tutorials/essentials/part-8-rtk-query-advanced.md:66-84
始终定义您的状态类型:为每个 slice 的状态结构定义明确的接口。
对动作负载使用 PayloadAction<T>:这确保了动作内容的正确类型定义。
创建预类型化的 Hooks:一次性定义 useAppSelector 和 useAppDispatch Hooks,以简化组件的使用。
明确类型化选择器:选择器应明确引用 RootState 作为它们的第一个参数。
不要过度限制类型:在保持类型安全的同时,酌情允许灵活性。
TypeScript 配置:
tsconfig.json 中使用严格模式noImplicitAny 和 strictNullChecks对异步 thunks 使用 .withTypes():创建了解您的存储配置的 createAsyncThunk 的预类型化版本。
对照 API 模式进行检查:确保您的接口与 API 预期类型匹配。
避免使用 any:当类型确实不确定时,改用 unknown。
不要过度导出类型:只导出跨文件需要的类型。
来源:docs/usage/UsageWithTypescript.md, docs/tutorials/typescript.md
| 错误 | 可能的原因 | 解决方案 |
|---|---|---|
| "Property does not exist on type 'RootState'"(类型“RootState”上不存在属性) | Slice reducer 未添加到存储中 | 将 slice reducer 添加到 configureStore |
使用 useSelector 时出现“No overload matches this call”(没有匹配的重载) | 选择器函数签名不正确 | 确保选择器接受 RootState |
| "Cannot find name 'AppDispatch'"(找不到名称“AppDispatch”) | 缺少导入 | 从存储文件中导入 AppDispatch |
| "'dispatch' is of type 'unknown'"('dispatch' 的类型为 'unknown') | 使用了未类型化的 useDispatch | 使用 useAppDispatch hook |
| "Object is possibly undefined"(对象可能未定义) | 需要进行空值检查 | 使用可选链或空值检查 |
| "Type instantiation is excessively deep"(类型实例化过深) | 循环类型引用 | 简化类型结构或使用类型断言 |
来源:docs/usage/UsageWithTypescript.md, docs/tutorials/typescript.md
在 Redux 应用程序中建立 TypeScript 后,您可能想探索:
来源:docs/usage/UsageWithTypescript.md, docs/usage/WritingTests.mdx
刷新此 Wiki
最后索引时间2025 年 4 月 18 日 (304031)