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

阮一峰《TypeScript 教程》学习笔记——symbol 类型

1. 一段话总结

symbol 是 ES2015 引入的原始类型,TypeScript 中用 symbol 表示该类型,其核心特征是每个通过 Symbol() 生成的值均独一无二;unique symbolsymbol 的子类型,用于表示“单个具体的 Symbol 值”,仅能通过 const 声明(let 声明会报错),const 声明时可省略类型(默认推断为 unique symbol),可作为属性名(避免冲突)或类的 readonly static 属性;类型推断上,let 声明的 Symbol 变量推断为 symbolconst 声明的 Symbol 变量默认推断为 unique symbol,但赋值给其他 symbol 类型变量时推断结果会变为 symbol


2. 思维导图

在这里插入图片描述


3. 详细总结

1. symbol 类型简介

  • 背景与定位:Symbol 是 ES2015 新增的原始类型,用于表示独一无二的值,TypeScript 中通过 symbol 关键字表示该类型。
  • 生成与特性
    • 需通过 Symbol() 函数生成值,无法通过字面量创建;
    • 核心特征:每个 Symbol 值均独一无二,即使通过相同方式生成,也不相等。
    • 示例:
      let x:symbol = Symbol();
      let y:symbol = Symbol();
      x === y; // false(值不相等)
      

2. unique symbol 类型(symbol 的子类型)

unique symbol 用于表示“单个具体的 Symbol 值”,解决了 symbol 类型无法定位到某一特定 Symbol 值的问题,其规则与用途如下:

(1)核心规则(含与 symbol 对比)
对比维度symbol 类型unique symbol 类型
声明方式let/const 均可仅允许 const 声明let 报错)
类型默认推断let 声明时默认推断为 symbolconst 声明 Symbol() 时默认推断为 unique symbol
值类型唯一性包含所有 Symbol 值,不区分具体值每个变量对应独立值类型(不同变量类型不同)
赋值规则可相互赋值(如 let a:symbol = b不可直接赋值给其他 unique symbol 变量,需用 typeof(如 const b:typeof a = a
子类型关系父类型子类型(可赋值给 symbol,反之不行)
  • 错误案例(unique symbol 声明与赋值):
    let y:unique symbol = Symbol(); // 报错(let 不允许)
    const a:unique symbol = Symbol();
    const b:unique symbol = a; // 报错(不同值类型,不可直接赋值)
    
  • 正确案例(unique symbol 赋值):
    const a:unique symbol = Symbol();
    const b:typeof a = a; // 正确(通过 typeof 匹配同值类型)
    
(2)特殊情况:Symbol.for()

Symbol.for('key') 会返回相同的 Symbol 值(相同 key 对应同一值),但 TypeScript 无法识别此特性,导致:

  • 两个通过 Symbol.for('key') 声明的 unique symbol 变量,类型不同但值相等
    const a:unique symbol = Symbol.for('foo');
    const b:unique symbol = Symbol.for('foo');
    a === b; // 实际值相等,但 TS 无法识别(语法无报错,逻辑上值相等)
    
(3)主要用途
  1. 作为对象属性名
    unique symbol 可作为属性名(保证不与其他属性冲突),symbol 类型因不固定具体值,用作属性名会报错:
    const x:unique symbol = Symbol();
    const y:symbol = Symbol();
    interface Foo {[x]: string; // 正确(unique symbol 可作属性名)[y]: string; // 报错(symbol 不可作属性名)
    }
    
  2. 作为类的属性
    仅允许赋值给类的 readonly static 属性(两个限定符缺一不可,确保属性固定不变):
    class C {static readonly foo:unique symbol = Symbol(); // 正确static foo2:unique symbol = Symbol(); // 报错(缺少 readonly)readonly foo3:unique symbol = Symbol(); // 报错(缺少 static)
    }
    

3. 类型推断规则

TypeScript 会根据变量声明方式(let/const)和赋值对象,自动推断 Symbol 变量的类型,具体规则如下:

变量声明方式赋值内容推断类型示例代码
let 声明直接赋值 Symbol()symbollet x = Symbol(); // 类型:symbol
const 声明直接赋值 Symbol()unique symbolconst x = Symbol(); // 类型:unique symbol
const 声明赋值给其他 symbol 变量symbollet x = Symbol(); const y = x; // 类型:symbol
let 声明赋值给 unique symbol 变量symbolconst x = Symbol(); let y = x; // 类型:symbol

4. 关键问题

问题1:为什么 unique symbol 类型的变量只能用 const 声明,不能用 let 声明?(侧重 unique symbol 的设计逻辑)

答案unique symbol 的核心定位是“表示单个、固定不变的具体 Symbol 值”,而 let 关键字声明的变量允许后续修改值,与 unique symbol 需“值固定”的特性冲突。若允许 let 声明,后续可能将其他 Symbol 值赋值给该变量,导致其“具体单个值”的定位失效。因此 TypeScript 强制 unique symbol 变量需用 const 声明,通过 const 的“值不可修改”特性,确保 unique symbol 始终指向同一具体 Symbol 值。

问题2:symbol 类型和 unique symbol 类型是父子类型关系,为什么 unique symbol 可以赋值给 symbol,但 symbol 不能赋值给 unique symbol?(侧重子类型赋值规则)

答案:根据 TypeScript 子类型赋值原则——“子类型包含父类型的所有特性,且具备额外专属特性,因此子类型可替代父类型,父类型不可替代子类型”:

  • unique symbolsymbol 的子类型:symbol 类型包含所有 Symbol 值(不区分具体值),unique symbol 在此基础上新增“指向具体单个值”的特性,因此 unique symbol 具备 symbol 的所有特性,可赋值给 symbol 类型变量;
  • symbol 不能赋值给 unique symbolsymbol 类型仅表示“任意 Symbol 值”,不具备 unique symbol 所需的“具体单个值”特性,若允许赋值,会导致 unique symbol 失去“定位具体值”的核心作用,因此 TypeScript 禁止该操作。

问题3:同样是 const 声明的 Symbol 变量,为什么有时推断为 unique symbol,有时推断为 symbol?(侧重类型推断的触发条件)

答案const 声明的 Symbol 变量类型推断结果,取决于赋值内容是否为“直接生成的 Symbol 值”

  1. const 变量直接赋值 Symbol() 时(如 const x = Symbol()),TypeScript 识别到该变量指向“单个具体的新 Symbol 值”,因此推断为 unique symbol
  2. const 变量赋值给其他 symbol 类型变量时(如 let y = Symbol(); const x = y),TypeScript 无法确定 y 指向的是“具体单个值”还是“任意 Symbol 值”,为避免类型误判,会将 x 推断为更宽泛的 symbol 类型,而非 unique symbol
http://www.dtcms.com/a/521061.html

相关文章:

  • 网站建设销售信wordpress国内图床
  • 天津高端网站php开发网站
  • PLL输出频谱分析 - 杂散和相位噪声检测
  • C++11 --- 右值引用、移动语义
  • 【Linux基础知识系列:第一百五十九篇】磁盘健康监测:smartctl
  • RA-Eco-RA4M2之RTC电子钟
  • 淘宝属于什么网站怎么做便宜做网站8818
  • 网站设计的公司怎么样php免费源码网站
  • 做品牌折扣微信推广的网站门户网站建设依据
  • NumPy 与 Matplotlib 使用教程
  • 如何做网站百科房地产销售述职报告
  • 做多语言网站教程建筑工程网络计划技术与应用
  • 微软Agent Framework
  • 上海app网站建设雷山网站快速排名
  • 深度学习基础:Tensor(张量)的创建方法详解
  • HTML5基础——18、CSS滤镜
  • 从零开始的C++学习生活 13:红黑树全面解析
  • RealVNC Viewer(Windows控制Mac)
  • mac下载wget
  • SQL进阶:深入解析SQL执行顺序
  • 专业网站建设的公司哪家好合肥计算机培训机构
  • C#实现摄像头视频录制与保存
  • 东莞网站建没可信网站是什么意思
  • led行业网站源码wordpress会员查看发布插件
  • 网站建设前期需要干嘛许昌网站建设哪家最好
  • 【Linux学习笔记】基于阻塞队列和环形队列的生产者消费者模型
  • GAN生成对抗网络学习-例子:生成逼真手写数字图
  • WPF MVVM下 ItemsControl条目命令绑定传参
  • 贵州网站制作公司电话wordpress有留言时邮件提醒
  • Python 脚本在工作日(周一到周五)的 8:00 到 19:00 之间持续运行,并在其他时间暂停(延时)