当前位置: 首页 > news >正文

JSX语法之TypeScript-02.1

TypeScript 是一种向 JavaScript 代码添加类型定义的常用方法。简单来理解就是JS是一种弱类型的语言,当代码比较复杂时会比较容易出错,所以定义了TypeScript添加了一些源码上的约定。

TypeScript安装

所有的React框架基本全部支持,但不同的的框架比如Expo等的安装方式不太一样。使用下面命令安装最新版本的 React 类型定义

npm install @types/react @types/react-dom

每个包含 JSX 的文件都必须使用 .tsx 文件扩展名。这是一个 TypeScript 特定的扩展,告诉 TypeScript 该文件包含 JSX。

TypeScript官方网址

React中的关键语法

描述组件的 props 类型

function MyButton({ title }: { title: string }) {return (<button>{title}</button>);
}export default function MyApp() {return (<div><h1>欢迎来到我的应用</h1><MyButton title="我是一个按钮" /></div>);
}

使用 interface 描述组件的 props

当参数过多时也可以这样描述,但感觉不是太好,代码量有点大,而且非常耦合。

interface MyButtonProps {/** 按钮文字 */title: string;/** 按钮是否禁用 */disabled: boolean;
}function MyButton({ title, disabled }: MyButtonProps) {return (<button disabled={disabled}>{title}</button>);
}export default function MyApp() {return (<div><h1>Welcome to my app</h1><MyButton title="我是一个禁用按钮" disabled={true}/></div>);
}

Hook 使用

useState

  • 显式设置类型
const [enabled, setEnabled] = useState(false);
// 显式设置类型为 "boolean"
const [enabled, setEnabled] = useState<boolean>(false);
  • 使用type定义取值范围
type Status = "idle" | "loading" | "success" | "error";
const [status, setStatus] = useState<Status>("idle");

type RequestState =| { status: 'idle' }| { status: 'loading' }| { status: 'success', data: any }| { status: 'error', error: Error };const [requestState, setRequestState] = useState<RequestState>({ status: 'idle' });

useReducer

详细见注释,共4个地方使用。

import {useReducer} from 'react';
//interface State 描述了 reducer state 的类型。
interface State {count: number 
};//type CounterAction 描述了可以 dispatch 至 reducer 的不同 action。
type CounterAction =| { type: "reset" }| { type: "setCount"; value: State["count"] }//为初始 state 提供类型,并且也将成为 useReducer 默认使用的类型。
const initialState: State = { count: 0 };//State 设置了 reducer 函数参数和返回值的类型
function stateReducer(state: State, action: CounterAction): State {switch (action.type) {case "reset":return initialState;case "setCount":return { ...state, count: action.value };default:throw new Error("Unknown action");}
}export default function App() {const [state, dispatch] = useReducer(stateReducer, initialState);const addFive = () => dispatch({ type: "setCount", value: state.count + 5 });const reset = () => dispatch({ type: "reset" });return (<div><h1>欢迎来到我的计数器</h1><p>计数: {state.count}</p><button onClick={addFive}>5</button><button onClick={reset}>重置</button></div>);
}

useContext

import { createContext, useContext, useState, useMemo } from 'react';// 这是一个简单的示例,但你可以想象一个更复杂的对象
type ComplexObject = {kind: string
};// 上下文在类型中创建为 `| null`,以准确反映默认值。
const Context = createContext<ComplexObject | null>(null);// 这个 Hook 会在运行时检查 context 是否存在,并在不存在时抛出一个错误。
const useGetComplexObject = () => {const object = useContext(Context);if (!object) { throw new Error("useGetComplexObject must be used within a Provider") }return object;
}export default function MyApp() {const object = useMemo(() => ({ kind: "complex" }), []);return (<Context.Provider value={object}><MyComponent /></Context.Provider>)
}function MyComponent() {const object = useGetComplexObject();return (<div><p>Current object: {object.kind}</p></div>)
}

React元素

Event元素

在 React 中处理 DOM 事件时,事件的类型通常可以从事件处理程序中推断出来。但是,当你想提取一个函数以传递给事件处理程序时,你需要明确设置事件的类型。React.ChangeEvent等完整的事件列表可查看此链接

import { useState } from 'react';export default function Form() {const [value, setValue] = useState("Change me");//注意看下这行function handleChange(event: React.ChangeEvent<HTMLInputElement>) {setValue(event.currentTarget.value);}return (<><input value={value} onChange={handleChange} /><p>值: {value}</p></>);
}

Dom元素

ReactNode可以在 JSX 中作为子元素传递的所有可能类型的并集。

interface ModalRendererProps {title: string;children: React.ReactNode;
}

style元素

interface MyComponentProps {style: React.CSSProperties;
}
http://www.dtcms.com/a/201014.html

相关文章:

  • Vue-样式绑定-style
  • Codeforces Round 1025 (Div. 2)(A-D)
  • C++:与7无关的数
  • 绿幕抠图与虚拟背景:直播美颜SDK开发前沿技术探索
  • 基于局部显著位置感知的异常掩码合成方法在CT图像肺部疾病异常检测与病变定位中的应用|文献速递-深度学习医疗AI最新文献
  • 1.portainer
  • AGI大模型(28):LangChain提示模板
  • C++多态的详细讲解
  • CoT(Chain-of-Thought,思维链)推理
  • 【Pandas】pandas DataFrame pct_change
  • 基础知识:Python类里面的@property装饰器的作用
  • 909. 蛇梯棋
  • NODEEDITOR
  • idea 安装飞算-javaAI 插件使用
  • AG-UI 协议是什么?MCP、A2A 后,AI 领域又新增 AG-UI 协议
  • 初识 java
  • Kubernetes in action-配置和应用升级
  • 关于 Web 漏洞原理与利用:2. XSS(跨站脚本攻击)
  • 斜齿轮直列齿轮箱市场分析报告:驱动因素、挑战及前景预测
  • 初学c语言16(内存函数)
  • 【Fine-Tuning】大模型微调高阶技术点概要
  • 【Unity】Unity中将字典序列化
  • YOLO模型predict(预测/推理)的参数设置
  • Java集合框架解析:从基础到底层源码
  • 题目练习之综合运用
  • 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
  • 《解锁具身智能社交密码:文化适配算法探秘》
  • 小目标检测层优化+多模态数据增强——YOLOv5在油气管道环焊缝缺陷识别的创新应用
  • SymPy | 隐函数导数求解:从基础到高阶的完整指南
  • 卓力达手撕垫片:精密制造的创新解决方案与多领域应用