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

TypeScript交叉类型、重复属性、类型断言和as const详解

1. 交叉类型(Intersection Types)

交叉类型使用 &运算符合并多个类型,新类型包含所有类型的属性:

interface Colorful {color: string;
}
interface Circle {radius: number;
}
type ColorfulCircle = Colorful & Circle; // 合并类型const cc: ColorfulCircle = {color: "red",   // 必须包含Colorful的属性radius: 42      // 必须包含Circle的属性
};

特性:

  • 相当于逻辑"与"操作

  • 适用于对象、函数等复杂类型组合

  • 与联合类型|互补(联合类型是逻辑"或")

2. 重复属性处理

当交叉类型中出现同名属性时:

type A = { x: number };
type B = { x: string };
type C = A & B;// 此时C中的x成为never类型:
// x: number & string → never

处理规则

  1. 基本类型冲突 → 变成never类型(如string & number

  2. 函数类型 → 函数重载(按声明顺序合并)

  3. 对象类型 → 递归合并嵌套属性

  4. 字面量类型 → 取交集(如'a' & ('a'|'b') → 'a'

3. 类型断言(Type Assertion)

手动指定值的类型,覆盖TS的类型推断:

// 尖括号语法
let value: any = "hello";
let len1: number = (<string>value).length;// as语法(推荐,避免JSX歧义)
let len2: number = (value as string).length;// 双重断言(解决类型不兼容)
const element = document.getElementById("root") as unknown as HTMLElement;

使用场景

  • DOM操作(如document.getElementById

  • 处理any类型的值

  • 类型转换(需确保运行时兼容)

4. as const断言

将值锁定为不可变的字面量类型:

// 普通数组 → 类型为number[]
let arr = [1, 2, 3]; // as const 数组 → 类型为readonly [1, 2, 3]
let constArr = [1, 2, 3] as const; // 对象属性变为只读字面量
const obj = {name: "Alice",age: 30
} as const;obj.age = 31; // 错误!Cannot assign to 'age' 

核心特性

  • 所有属性变为readonly

  • 数字/字符串等变为字面量类型

  • 数组变为元组(tuple)类型

  • 冻结对象结构(无法增删改属性)

总结对比

特性交叉类型 (&)类型断言 (as)as const
作用类型合并覆盖类型推断锁定字面量类型
可变性保持原始可变性保持原始可变性所有属性变readonly
典型场景组合多个接口DOM操作/类型转换配置对象/常量定义
类型变化创建新类型不改变运行时值缩小类型范围

注意:交叉类型与接口继承(extends)类似,但前者更灵活支持类型组合,后者需要显式声明关系。类型断言不是类型转换,仅在编译阶段起作用。

http://www.dtcms.com/a/362040.html

相关文章:

  • 光颉科技)Viking)的CS25FTFR009 1225 0.009R/9mR 3W电阻介绍-华年商城
  • 【笔记】float类型的精度有限,无法精确表示123456.6789
  • 【Audio】静音或振动模式下重复来电响铃
  • Java Web项目后台管理系统之内容管理仿写(三):图片上传
  • 使用 BayesFlow 通过神经网络简化贝叶斯推断(一)
  • C扩展4:X宏(X-MACRO)
  • JS循环机制
  • IS-IS的原理
  • Java超卖问题
  • MySQL安装与使用指南
  • 【读论文】量子关联增强双梳光谱技术
  • 力扣404 代码随想录Day15 第三题
  • 故障排查指南:理解与解决 “No route to host“ 错误
  • NOSQL——Redis
  • MySQL基础知识保姆级教程(四)视图与约束
  • 浅谈中断控制器:从 IRQ 到 IRR、IMR、In-Service Register
  • 软考-操作系统-错题收集(3)文件系统的索引节点结构
  • 【前端】《手把手带你入门前端》前端的一整套从开发到打包流程, 这篇文章都会教会你;什么是vue,Ajax,Nginx,前端三大件?
  • ComPE for win 纯净的PE系统
  • 软考中级数据库系统工程师学习专篇(67、数据库恢复)
  • Spring Security 深度学习(四): 会话管理与CSRF防护
  • 2025 数字化转型期,值得关注的 10 项高价值证书解析
  • Linux笔记---计算机网络概述
  • 视频动作识别模型-C3D
  • 线程池项目代码细节5(解决linux死锁问题)
  • 关系型数据库——GaussDB的简单学习
  • 《投资-43》- 自然=》生物=》人类社会=》商业=》金融=》股市=》投资的共同逻辑:生存竞争与进化论
  • 前端实现查询数据【导出】功能
  • 自制扫地机器人(二) Arduino 机器人避障设计——东方仙盟
  • A股大盘数据-20250901 分析