6 在React中使用TypeScript
6.1 使用CRA创建支持TS的项目
bash
npx create-react-app react-ts --template typescript
cd react-ts-basic
yarn start
提示
相对于非 TS 项目,目录结构主要由以下三个变化:
- 项目根目录中增加了 tsconfig.json 配置文件:指定 TS 的编译选项(比如,编译时是否移除注释)。
- React 组件的文件扩展名变为:*.tsx。
- src 目录中增加了 react-app-env.d.ts:React 项目默认的类型声明文件
react-app-env.d.ts: React项目默认的类型声明文件
三斜线指令:指定依赖的其他类型声明文件,types 表示依赖的类型声明文件包的名称。
ts
/// <reference types="react-scripts" />
提示
解释:告诉 TS 帮我加载 react-scripts 这个包提供的类型声明。 react-scripts 的类型声明文件包含了两部分类型:
- react、react-dom、node 的类型
- 图片、样式等模块的类型,以允许在代码中导入图片、SVG 等文件。 TS 会自动加载该 .d.ts 文件,以提供类型声明(通过修改 tsconfig.json 中的 include 配置来验证)。
6.2 TS配置文件tsconfig.json
bash
tsc --init
tsc hello.ts --target es6
tsc hello.ts # 忽略tsconfig.json文件
tsc # 启用tsconfig.json
6.3 React中常用类型
React通过@types/react,@types/react-dom类型声明包,来提供类型
6.3.1 函数组件
1. 函数组件的类型以及组件的属性
ts
type Props = { name: string; age?: number }
const Hello: FC<Props> = ({name,age})=>(
<div>你好, 我叫: {name}, 我{age}岁了</div>
)
// 推荐
const Hello = ({name,age}:Props)=>(
<div>你好, 我叫: {name}, 我{age}岁了</div>
)
html
<Hello name="jack" />
2. 函数组件属性的默认值(defaultProps)
ts
type Props = { name: string; age?: number }
const Hello: FC<Props> = ({name,age})=>(
<div>你好, 我叫: {name}, 我{age}岁了</div>
)
Hello.defaultProps={age:18}
// 推荐
const Hello = ({name,age=18}:Props)=>(
<div>你好, 我叫: {name}, 我{age}岁了</div>
)
3. 事件绑定和事件对象
html
<input onChange={e=>{}} />
button
html
<button onClick={onClick}>点赞</button>
ts
const onClick = ()=>{}
const onClick1 = (e: React.MouseEvent<HTMLButtonElement>)=>{}
input
html
<input onChange={onChange} />
ts
const onChange = (e: React.ChangEvent<HTMLInputElement>)=>{}