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

类型分类、联合类型、交叉类型

类型分类体系

基础类型

1. 字符串类型(string)

2. 数字类型(number)

3. 布尔类型(boolean)

4. 大整数类型(bigint)

5. 符号类型(symbol)

6. undefined 和 null

7. 字面量类型 限定了值必须是某个具体的字面量,字面量类型包括字符串字面量、数字字面量和布尔字面量。

对象类型

Object类型表示所有非原始类型(即所有对象)。Object是所有引用类型的根类型,类似于 Java 中的Object类。

// Object 类型可以接受任何对象 let obj: Object = { name: "Alice" }; // ✅ obj = [1, 2, 3]; // ✅ 数组是对象 obj = function() {}; // ✅ 函数是对象 obj = new Date(); // ✅ Date 是对象 obj = /regex/; // ✅ 正则表达式是对象

TS新增类型

类型核心含义使用场景安全性
any任意类型(关闭类型检查)迁移旧代码、第三方库❌ 最不安全
unknown未知类型(安全的 any)处理未知值、API 响应✅ 安全(需收窄)
void无返回值函数没有返回值✅ 安全
never永不返回异常、无限循环、穷尽检查✅ 最严格
enum枚举常量集合定义一组相关常量✅ 安全

unknownany的类型安全版本。它表示"一个未知的值",但不允许你直接操作它,必须先进行类型收窄(类型守卫)。

unknown 的实际应用:

// 1. API 响应处理 async function fetchData(url: string): Promise<unknown> { const response = await fetch(url); const data = await response.json(); return data; // 返回 unknown } async function getUser(id: number): Promise<User> { const data = await fetchData(`/api/users/${id}`); // 必须验证数据类型 if (typeof data === "object" && data !== null) { const user = data as any; if (typeof user.id === "number" && typeof user.name === "string") { return user as User; } } throw new Error("Invalid user data"); } // 2. 错误处理(TypeScript 4.0+) try { // 某些操作 throw new Error("Something went wrong"); } catch (error) { // error 类型是 unknown if (error instanceof Error) { console.log(error.message); } else if (typeof error === "string") { console.log(error); } else { console.log("Unknown error"); } } // 3. 类型断言(谨慎使用) let data: unknown = "hello world"; let str: string = data as string; // 断言为 string console.log(str.length); // 可以

never表示永远不会发生的值。它是 TypeScript 类型系统的"底部类型",没有任何值可以赋值给never类型。never 是任何类型的子类型

// never 是任何类型的子类型 let str: string = "hello"; // str = neverVar; // 但反过来不行 // never 可以赋值给任何类型 function getNever(): never { throw new Error("Never"); } let numberVar: number = getNever(); // ✅ 可以 let stringVar: string = getNever(); // ✅ 可以 let booleanVar: boolean = getNever(); // ✅ 可以 // 但是没有任何类型可以赋值给 never // let neverVar: never = "hello"; // ❌ 错误 // let neverVar2: never = 42; // ❌ 错误 // let neverVar3: never = undefined; // ❌ 错误

联合类型

表示一个值可以是多种类型中的一种,用竖线|分隔。它表达了逻辑上的"或"(OR)关系。

联合类型就像是一个"类型开关",变量可以在多个类型之间切换,但一次只能是一种类型

// 基础语法 type MyType = Type1 | Type2 | Type3; // 示例:字符串或数字 let id: string | number; id = "abc123"; // ✅ id = 12345; // ✅ // id = true; // ❌ 错误:boolean 不在联合中
// 基础类型 type ID = string | number; type Result = string | number | boolean; type Nullable = string | null | undefined;
// 函数联合类型 type StringProcessor = (input: string) => string; type NumberProcessor = (input: number) => number; type Processor = StringProcessor | NumberProcessor;
// 字符串字面量联合 type Direction = "up" | "down" | "left" | "right"; type HttpMethod = "GET" | "POST" | "PUT" | "DELETE";

交叉类型

交叉类型(Intersection Types)表示一个值同时具有多种类型的所有成员,用与符号&连接。它表达了逻辑上的"与"(AND)关系。

交叉类型就像是"类型合并器",把多个类型的属性全部组合到一个新类型中。它可以被理解为所有类型的交集

如果交叉的两个对象属性如果存在相同但是类型不同 就会冲突报错。

// 基础语法 type Combined = Type1 & Type2 & Type3; // 示例:合并两个接口 interface Person { name: string; age: number; } interface Employee { employeeId: string; department: string; } // 交叉类型:同时具有 Person 和 Employee 的所有属性 type EmployeePerson = Person & Employee; const worker: EmployeePerson = { name: "Alice", // 来自 Person age: 30, // 来自 Person employeeId: "E001", // 来自 Employee department: "Engineering" // 来自 Employee };

TypeScript 中 Interface 和 Class 的区别详解

特性Interface(接口)Class(类)
本质纯类型定义既是类型又是值
编译后完全消失变成 JavaScript 代码
作用描述对象结构创建对象蓝图
实例化❌ 不能 new✅ 可以 new
方法实现❌ 只有声明✅ 可以包含实现
访问修饰符❌ 不支持✅ public/private/protected
继承✅ 可以继承多个✅ 只能单继承
http://www.gsyq.cn/news/1637238.html

相关文章:

  • 2026软件测试面试官在面试的时候会做些什么?
  • DDR3 T型拓扑 PCB 设计实战:4片 MT41J256M8HX-15E 布局与端接电阻配置
  • Supabase 数据库介绍:开源 Firebase 替代方案
  • 企业知识库更新闭环:RAG 不是接入一次就结束
  • 如何完整备份微信聊天记录:WeChatMsg数据自主管理实用指南
  • PADS VX2.8 BGA扇出实战:1.0mm间距芯片的4步配置与十字通道预留
  • Linux 服务器访问控制:组合使用 PAM wheel 组与 iptables 限制 SSH 来源
  • 2026年联发科嵌入式岗位高频面试题带参考答案
  • 数据集切分策略:随机划分不一定适合时间序列任务
  • 3个关键步骤让AirPods在Windows上重获完整功能:AirPodsDesktop终极解决方案
  • 软件测试面试总结分享
  • 计算机网络知识点总结(四)Linux C++ Socket实现“伪”半双工聊天室程序
  • 大疆 M3508 电机速度 PID 调参实战:从振荡到稳定,3 组参数对比分析
  • 【全网大测评】有没有降AI率的靠谱软件推荐?2026年亲测15款降AI率工具,帮你避坑省钱!
  • Go 微服务限流:别把所有请求都堵在入口
  • 2026建筑合同管理系统怎么选才不踩坑:房建企业合同、签证、产值与付款闭环指南
  • AI 创业假设验证:先证明有人痛,再证明模型强
  • 2026年暑假学习规划排名:这样安排让孩子高效又充实
  • 椭偏仪—介质膜的首选方法
  • OWTB 3PL 核心主流程与行业落地方案
  • ChromaControl:实现跨品牌RGB设备统一控制的终极解决方案
  • 剪映专业版教程:制作推拉平移相册效果
  • 【OpenHarmony/HarmonyOs 】数学视界实战:悬浮导航栏、沉浸光感与全新交互体验
  • 基于51单片机的气象站环境检测系统 风速风向温湿度 气象监测仪24(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 微服务合同测试:创业团队也别只靠联调
  • 2026美妆行业会员管理系统怎么选?跨店互通、复购提升、成本对比
  • 2026年一键生成论文工具实测:5款AI神器闭眼选不翻车
  • VRoid Studio中文汉化完整攻略:5步摆脱英文界面困扰
  • 5分钟快速上手:Mi-Create可视化小米手表表盘设计终极指南
  • YOLO26 全网独家改进创新:ECCV2026 S2-FracMix 颈部网络,引入形状-尺度分形混合 Neck,独家创新!