news 2026/9/15 19:56:22

300TypeScript基础知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
300TypeScript基础知识

主要学习react中ts的使用和概念


第一阶段:Ts基础

TypeScript 的核心思想是:给变量穿上约束的衣服

1. 原始类型、数组、元组

letname:string="Gemini";letage:number=25;letisAI:boolean=true;// 数组的两种写法letskills:string[]=['React','TS'];letscores:Array<number>=[90,85];// 元组 (Tuple):固定长度和类型的数组letuser:[number,string]=[1,'Admin'];

2. 函数的定义

//普通函数定义functionadd(x:number,y:number):number{returnx+y;}letmyAdd=function(x:number,y:number):number{returnx+y;};
// 定义函数类型typeGreetFn=(name:string)=>string;constsayHello:GreetFn=(n)=>`Hello,${n}`;

3. 接口 (Interface) vs 类型别名 (Type)

  • Interface: 侧重于描述对象的结构,支持继承(extends)和声明合并。

  • Type: 更灵活,可以定义基本类型、联合类型、元组等。

interfaceLabelledValue{label:string;num?:number;}

这是最常用的功能,用于定义对象的结构。

特性InterfaceType
核心用途定义对象的形状定义任何类型(联合、元组等)
扩展方式使用extends关键字使用&(交叉类型)
重复定义会自动合并(Declaration Merging)不允许重复定义

建议:定义公共 API 或组件 Props 时优先使用interface;定义复杂逻辑、联合类型时使用type


4. 联合类型与字面量

// 联合类型:变量可以是多种类型之一letstatus:"loading"|"success"|"error";letcurrentStatus:Status="loading";// 只能是这三个字符串之一// 类型守卫 (Type Guard)functionprintId(id:number|string){if(typeofid==="string"){console.log(id.toUpperCase());// 此时 TS 知道 id 是 string}else{console.log(id.toFixed());// 此时 TS 知道 id 是 number}}

5. 泛型 Generics

泛型是 TS 最强大的地方,它允许你在定义时不指定具体类型,而在使用时动态决定。

// 这里的 T 就像是一个变量占位符functionidentity<T>(arg:T):T{returnarg;}constres1=identity<string>("hello");// T 被确定为 stringconstres2=identity<number>(100);// T 被确定为 number

第二阶段:React中应用


第一部分:TypeScript 语言核心

1. 类型系统的等级制度

在 TS 中,类型是有层级的。理解这一点能帮你解决 90% 的类型兼容性问题。

  • Top Types (顶级类型):anyunknown

  • any: 彻底放弃检查,是代码中的“黑洞”。

  • unknown: 虽也是万能类型,但在使用前必须进行类型检查(类型收窄)。

  • Bottom Type (底层类型):never。表示永远不会出现的值。常用于穷举检查。

2. Interface 与 Type 的深度对峙

在 React 项目中,两者的界限日益模糊,但底层逻辑不同:

  • Interface (面向对象): 描述“形状”。它支持声明合并(Declaration Merging)。如果你定义了两个同名的 Interface,TS 会自动把它们合二为一。这在扩展第三方库的类型时非常有用。
  • Type (函数式/代数): 描述“别名”。它更强大,可以使用联合(|)、交叉(&)、位运算等。Type 不能被重新打开添加属性

第二部分:工程化配置

tsconfig.json决定了你的代码如何被“审判”。以下是生产环境中最关键的三个配置:

配置项作用为什么重要
strict: true开启所有严格模式防止null导致的运行时崩溃,禁用隐式any
noImplicitAny禁止隐式 any强制你思考每个变量的来源,是项目质量的底线。
paths路径别名../../../../components简化为@/components,解耦目录结构。

第三部分:React + TS 实战兵法

1. 组件 Props 的“三板斧”

在定义组件 Props 时,利用 TS 的特性可以极大提升开发体验。

interface GreetProps { name: string; // 1. 可选属性 priority?: number; // 2. 字面量联合类型:限制范围 theme: 'dark' | 'light'; // 3. 复杂对象:引用其他接口 metadata: Record<string, unknown>; } // 推荐写法:使用普通函数解构 Props export const Greet = ({ name, theme = 'light' }: GreetProps) => { return <div className={theme}>Hello {name}</div>; };

2. Hooks 的高阶标注

Hooks 是 React 的核心,其类型标注主要依靠泛型

  • useState:
// 显式指定联合类型,处理“空状态” const [user, setUser] = useState<User | null>(null);
  • useRef:
    有两个场景:
  1. DOM 引用:const inputRef = useRef<HTMLInputElement>(null);(注意初始化为null)。
  2. 变量保存:const timerRef = useRef<number>();

3. 事件系统的“精确打击”

不要直接使用any处理事件。React 提供了一整套事件类型,命名规则通常是React.[事件名]Event<HTML元素类型>

const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => { console.log(e.target.value); // 这里 e.target 会被精准推断为 HTMLInputElement };

第四部分:类型进阶

1. 工具类型 (Utility Types) 的降维打击

TS 内置的工具类型其实就是类型函数

  • Partial<T>: 把所有 Props 变可选。
  • Omit<T, 'id'>: 复制 T 的所有属性,但剔除id
  • Pick<T, 'title' | 'desc'>: 只从 T 中挑选部分属性。

2. 泛型组件 (Generic Components)

当你需要组件支持多种类型的数据流时(如自定义下拉框、表格):

interface SelectProps<T> { options: T[]; onSelect: (value: T) => void; } // 在函数名前使用 <T,> 开启泛型 export const Select = <T,>({ options, onSelect }: SelectProps<T>) => { return ( <ul> {options.map((opt, i) => ( <li key={i} onClick={() => onSelect(opt)}>选择</li> ))} </ul> ); }; // 使用时,TS 会根据传入的 options 自动推断 T <Select options={[1, 2, 3]} onSelect={(val) => console.log(val + 1)} />

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 2:40:15

【计网】网络分层模型和http协议

前言计算机网络是一个复杂的系统&#xff0c;采取分层的结构&#xff0c;可以将复杂系统分解为可管理的模块。每层模块专注解决特定问题&#xff0c;使其各司其职&#xff0c;便于管理维护。在网络分层模型中&#xff0c;每个分层都接收由它下一层所提供的特定服务&#xff0c;…

作者头像 李华
网站建设 2026/9/15 10:22:17

Kotaemon在华为云上的部署实践:全流程记录

Kotaemon在华为云上的部署实践&#xff1a;全流程记录 在企业智能客服、知识库问答系统日益普及的今天&#xff0c;一个真正“可用”的AI代理不仅要能回答问题&#xff0c;更要答得准、有依据、可维护。然而现实是&#xff0c;许多基于大模型的聊天机器人仍困于“幻觉频发”“…

作者头像 李华
网站建设 2026/9/15 9:24:58

校园便利平台|基于springboot + vue校园便利平台系统(源码+数据库+文档)

校园便利平台 目录 基于springboot vue校园便利平台系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue校园便利平台系统 一、前言 博主介绍&…

作者头像 李华
网站建设 2026/9/15 21:43:28

38、Linux 脚本编程:bc 计算器、数组与特殊技巧

Linux 脚本编程:bc 计算器、数组与特殊技巧 1. bc - 任意精度计算器语言 在处理整数运算时,shell 能满足很多需求,但当需要进行高级数学运算或使用浮点数时,shell 就显得力不从心了。这时可以借助外部程序,比如 bc 。 bc 是许多 Linux 系统上都有的计算器程序,它能…

作者头像 李华
网站建设 2026/9/16 4:14:51

揭秘高亮车灯升级2025年值得推荐的TOP8车灯产品

在2025年&#xff0c;车灯升级已成为车主关注的热点之一&#xff0c;尤其是高亮车灯的选择。作为提升行车安全与舒适性的关键装备&#xff0c;市场上涌现出多款值得推荐的车灯产品。从LED日行灯到高效的激光透镜&#xff0c;这些产品通过先进的技术改善了照明效果和能效。为满足…

作者头像 李华
网站建设 2026/9/14 16:16:40

WSL2 / Ubuntu 下用 SDKMAN 管理多版本 Java(项目级切换,真香)

WSL2 / Ubuntu 下用 SDKMAN 管理多版本 Java&#xff08;项目级切换&#xff0c;真香&#xff09; 在 WSL2 Ubuntu 做 Java 后端开发时&#xff0c;经常会遇到这种组合&#xff1a; 老项目还在 Java 8新项目已经是 Java 17 / 21同一台机器、同一个终端&#xff0c;需要随时切换…

作者头像 李华