项目改造
改造建议
- 项目中使用 TS 时,既可以包含 js 文件,又可以包含 ts 文件
.js
、.jsx
(使用 JS 时,React 组件对应的文件后缀)
.ts
、.tsx
(使用 TS 时,React 组件对应的文件后缀)、.d.ts
- 在已有项目中,添加 TS 时的推荐模式
- 新的功能用 TS
- 已实现的功能,可以继续保持 JS 文件,慢慢修改为 TS 即可
- React 组件对应的文件后缀,修改为:
.tsx
- 工具函数对应的文件后缀,修改为:
.ts
或者为其添加类型声明文件 .d.ts
修改入口文件
index.ts
- 直接将文件后缀修改为 index.tsx 即可
- 需要重启项目
修改App.js
- 讲App.js 改成app.tsx即可
- 需要安装react-router-dom的类型
utils工具函数改造
history.js
不需要改造,直接把js改成ts即可
storage.js
非空断言
Non-null assertion operator
- TS 中提供一个运算符:
!
非空断言
- 如果一个值,它的类型可能是 null 或 undefined,但是,我们在使用时又很确定它的值一定不是 null 或 unde,此时,就可以通过
非空断言
来告诉 TS 听哥的,哥很确定它的不是 null 或 undefined
- 注意:这个操作是风险的,非空断言,仅仅是让 TS 中的类型检查不再校验 null 或 undefined,但是,如果它的值真的是 null 或 undefined,代码会在运行时报错!!!
整体修改
request.js改造
讲js改成ts即可
通用组件改造
Icon组件修改
typescript中ref的使用
Img懒加载组件修改
InputHTMLAttributes中包含了Input框所有能够支持的属性
TS 中的 &(交叉类型)
https://www.typescriptlang.org/docs/handbook/2/objects.html#intersection-types
交叉类型需要注意的地方:同名的属性容易冲突
使用omit优化
Textarea组件改造
NavBar组件改造
AuthRoute组件改造
https://stackoverflow.com/questions/53104165/implement-react-router-privateroute-in-typescript-project/53111155#
页面改造
Layout组件
直接把js改成tsx
Login组件
location的处理
https://stackoverflow.com/questions/61668623/react-typescript-correct-type-for-uselocation-from-react-router-dom
redux-action修改
索引签名
- 索引签名
- 语法:
[key: string]: any
- 应用场景:我要使用一个对象类型,但是,我不确定对象中有什么属性,此时,就可以使用索引签名类型了
redux-reducer修改
类型提取
Profile组件改造
修改redux-reducer
修改redux-action的修改
泛型工具类型 - ReturnType
https://stackoverflow.com/questions/57472105/react-redux-useselector-typescript-type-for-state/57472389
获取redux状态的类型
https://redux.js.org/usage/usage-with-typescript
- 讲store/index.js修改为store/index.ts
useSelector 的类型
TS 中的索引查询类型
- 语法:
对象类型[键]
- 作用:查询 对象类型 中某个属性对应的类型
Home组件的修改
修改home组件-reducer
修改home组件-reducer的修改-完成
解决问题:request中dispatch的问题
原因: saveToken没有指定返回值类型,
把type推断为string类型 string类型无法常量类型赋值,所以报错了
解决方案:
方案2:
解决问题:logout的错误
原因:store.dispatch的参数必须是一个对象,且要有type属性
RootThunkAction的使用
https://redux.js.org/usage/usage-with-typescript#type-checking-redux-thunks
场景:
我们如果需要使用redux-thunk的action,需要指定两个参数的类型,dispatch和getState的类型。
redux-thunk中间件帮助我们提供了一个thunkAction的类型。
以后,只要是redux-thunk的action的类型,我们只需要指定返回类型为RootThunkAction类型即可,不需要指定dispatch和getState的类型