[TypeScript学习笔记-10]一个特殊且重要的类型:Symbol
在 TypeScript 中Symbol是 ES6 引入的一种原始数据类型与number、string、boolean等基础类型并列。它表示一个独一无二、不可变的值通常被用作对象属性的键以确保属性名不会发生冲突。在 TypeScript 中声明一个 Symbol 类型的变量写法如下letsym:symbolSymbol(描述信息);这里的描述信息只是一个可选的描述字符串仅用于调试或日志输出并不会影响 Symbol 本身的唯一性。即使两个 Symbol 使用相同的描述它们也是完全不同的两个值。1. Symbol 具有怎样的特性举例Symbol 的核心特性可以概括为以下几点1.1 唯一性每次调用Symbol()都会生成一个全新的、独一无二的值即使描述相同也不相等consts1Symbol(key);consts2Symbol(key);console.log(s1s2);// false1.2 不可变性Symbol 一旦创建其值就无法被修改它本身是一个原始值不是对象因此也不能调用new Symbol()// 错误写法Symbol 是原始类型不能使用 new// const s new Symbol();// 正确写法constsSymbol(ok);1.3 可作为对象属性的键Symbol 最常见的用途是作为对象属性的键从而避免属性名冲突constuniqueKeySymbol(id);constobj{[uniqueKey]:123,name:Tom};console.log(obj[uniqueKey]);// 1231.4 不会被常规遍历方法枚举使用for...in或Object.keys()遍历对象时Symbol 类型的属性键不会被枚举出来constkeySymbol(hidden);constobj{name:Tom,[key]:secret};console.log(Object.keys(obj));// [name]console.log(Object.getOwnPropertySymbols(obj));// [ Symbol(hidden) ]2. unique Symbol 如何正确理解在 TypeScript 中如果仅仅把变量推导为symbol类型类型系统是无法分清具体的 Symbol 的。比如在如下的例子中在 TypeScript 看来foo和bar都是 Symbol 类型它可以让你写bar foo但这在逻辑上可能是不合理的。letfoo:symbolSymbol(Foo);letbar:symbolSymbol(bar);barfoo;为了解决这个问题TypeScript 引入了unique symbol。它是symbol的子类型Subtype代表某一个特定、具体、独一无二的 Symbol 类型。严格的使用限制因为unique symbol代表一个具体的、不可变的值所以 TypeScript 对它有极其严格的语法要求必须使用const声明不能用 let 或 var或者作为类Class的readonly static属性。不能手动显式指定类型为unique symbol却赋值一个普通变量它只能由 TypeScript 通过const自动推导出来。constfoo:uniquesymbolSymbol(Foo);// OK/// (TS) A variable whose type is a unique symbol type must be const.letbar:uniquesymbolSymbol(Bar);// (TS) A variable whose type is a unique symbol type must be const.varbaz:uniquesymbolSymbol(Baz);classcls{// OKstaticreadonlyfoo:uniquesymbolSymbol(Bar);// (TS) A property of a class whose type is a unique symbol type must be both static and readonly.staticbar:uniquesymbolSymbol(Bar);}3. Symbol 的具体应用场景Symbol是 TypeScript 中一个非常特殊的原始类型它的核心价值在于唯一性。无论是作为对象属性的键来避免冲突还是借助unique symbol在类型层面区分不同的标记Symbol 都为开发者提供了一种更安全、更灵活的设计手段。在实际项目中合理使用 Symbol 可以让代码结构更清晰也能减少因命名冲突而引发的潜在问题。3.1 防止对象属性名冲突当多个模块或库需要往同一个对象上挂载属性时使用 Symbol 作为键可以避免命名冲突constlibASymbol(libA);constlibBSymbol(libB);constsharedObj:any{};sharedObj[libA]A 库的数据;sharedObj[libB]B 库的数据;console.log(sharedObj[libA]);// A 库的数据console.log(sharedObj[libB]);// B 库的数据3.2 定义类的“隐藏”成员利用 Symbol 属性不会被常规方法枚举的特性可以在类中定义一些内部使用的成员const_countSymbol(count);classCounter{private[_count]:number0;increment(){this[_count];}getvalue(){returnthis[_count];}}constcnewCounter();c.increment();c.increment();console.log(c.value);// 23.3 实现全局注册表Symbol.forSymbol.for()会在全局注册表中查找并复用已存在的 Symbol适合在多个模块间共享同一个 Symbolconsts1Symbol.for(shared);consts2Symbol.for(shared);console.log(s1s2);// true4. 使用内置的 Symbol 常量JavaScript 提供了一些内置的 Symbol 常量用于自定义对象的基础行为。4.1 Symbol.iterator Symbol.asyncIteratorSymbol.iterator和Symbol.asyncIterator分别用于定义一个同步和异步迭代器 前者会在对象被用于for...of循环、解构赋值...展开运算符或Array.from()时被调用 后者则在for await...of循环遍历异步数据源被调用。constrange{from:1,to:3,[Symbol.iterator](){letcurrentthis.from;return{next:()currentthis.to?{value:current,done:false}:{done:true}};}};for(letnumofrange)console.log(num);// 输出: 1, 2, 34.2 Symbol.toPrimitiveSymbol.toPrimitive用于定义当前对象针对指定基元类型数字、字符串、布尔值的转换规则。自定义对象在被转换为原始类型值时的行为。对象参与数学运算如 、-或字符串拼接、比较时会被调用。在下面的演示程序中我们定义了常量对象PI并利用将此Symbol作为属性名称定义了类型转换函数。constPI{[Symbol.toPrimitive](hint:string){if(hintnumber)return3.14;if(hintstring)returnπ;returntrue;// 默认}};console.log(${PI});//πconsole.log(PIasany*Math.pow(2,2));// 12.564.3 Symbol.hasInstanceSymbol.hasInstance用来自定义 instanceof 运算符的识别逻辑。当执行obj instanceof MyClass时实际上是在调用MyClass[Symbol.hasInstance](obj)。在下面的演示程序中我们定义了表示质数的类型PrimeNumber并以此Symbol命名了一个静态方法用来确定指定的对象是否是一个质数。classPrimeNumber{static[Symbol.hasInstance](num:any){returnPrimeNumber.isPrimeNumber(num)}staticisPrimeNumber(num:any){if(num1||!Number.isInteger(num))returnfalse;if(num2)returntrue;if(num%20)returnfalse;constboundaryMath.sqrt(num);for(leti3;iboundary;i2){if(num%i0)returnfalse;}returntrue;}}console.log(2asanyinstanceofPrimeNumber)// Trueconsole.log(3asanyinstanceofPrimeNumber)// Trueconsole.log(4asanyinstanceofPrimeNumber)// False4.4 其它TypeScript还为很多常用的应用场景定义了对应的Symbol 比如当你在字符串上调用match、replace、search、split等方法且传入的参数是一个自定义对象时你可以通过以下符号拦截这些操作Symbol.match改变String.prototype.match()的行为。也用于 isRegExp 的内部判断Symbol.replace改变String.prototype.replace()的行为允许自定义替换逻辑Symbol.search改变String.prototype.search()的行为Symbol.split改变String.prototype.split()的行为。

相关新闻

ChatGPT新插件上线:可连Mac短信,还能分析交流给出沟通建议!

ChatGPT新插件上线:可连Mac短信,还能分析交流给出沟通建议!

ZDNET核心要点ChatGPT如今能够连接到Mac上的短信,用户既可以让它发送短信、搜索已有消息,更厉害的是,还能让这个AI分析短信。和许多人一样,有人经常与家人、亲戚、朋友及其他人互发短信,但不一定会思考交流方式。现在&…

2026/8/23 23:32:44 阅读更多 →
沃尔玛终支持 Apple Pay 和 Google Pay,自家支付系统何去何从?

沃尔玛终支持 Apple Pay 和 Google Pay,自家支付系统何去何从?

沃尔玛终支持 Apple Pay 和 Google Pay 碰一碰支付,自家支付系统何去何从?今天上午,沃尔玛宣布开始接受信用卡、Google Pay、Apple Pay 及其他近场通信(NFC)系统的碰一碰支付。此前,它一直力推自家的沃尔玛…

2026/8/23 23:32:44 阅读更多 →
心理咨询室设备推荐:十大必备清单及价格参考

心理咨询室设备推荐:十大必备清单及价格参考

心理咨询室设备推荐:比起沙发,这些才是“刚需” 心理咨询室设备,不是摆在架子上好看的摆件,而是围绕心理评估、放松训练和情绪干预等真实需求设计的专业软硬件工具。我上周走访一所新建中学的辅导中心,看到采购清单里只…

2026/8/23 23:32:44 阅读更多 →

最新新闻

4个场景跑通 Home Assistant iOS应用:从抬腕看温到 CarPlay 控灯的智能家居控制

4个场景跑通 Home Assistant iOS应用:从抬腕看温到 CarPlay 控灯的智能家居控制

4个场景跑通 Home Assistant iOS应用:从抬腕看温到 CarPlay 控灯的智能家居控制 【免费下载链接】iOS :iphone: Home Assistant for Apple platforms 项目地址: https://gitcode.com/gh_mirrors/ios1/iOS 早上八点半,你出门前抬腕瞥一眼 Apple Wa…

2026/8/24 3:16:05 阅读更多 →
初始git push代码及后续管理

初始git push代码及后续管理

使用浏览器可以访问github并创建新的远程仓库,但通过VScode中git插件的代码提交常常因网络问题而失败。这里介绍github官网推荐的通过ssh连接后通过git命令行提交。前提:1. 可以登录github以创建新远程仓库;2. 已在github上配置好本地ssh密钥…

2026/8/24 3:16:05 阅读更多 →
数据中心环境监控实操全流程:从传感器部署到告警落地

数据中心环境监控实操全流程:从传感器部署到告警落地

数据中心环境监控实操全流程:从传感器部署到告警落地 【免费下载链接】awesome-sysadmin A curated list of amazingly awesome open-source sysadmin resources. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-sysadmin 凌晨3点,空…

2026/8/24 3:16:05 阅读更多 →
DeepSeek-V4 Vision多模态API集成指南:从图文分离到智能文档处理

DeepSeek-V4 Vision多模态API集成指南:从图文分离到智能文档处理

最近在尝试把一些文档处理流程自动化时,遇到了一个典型问题:我需要从一堆PDF报告和截图里快速提取关键信息,比如表格数据、图表标题和关键结论。过去,这要么靠手动复制粘贴,要么得用OCR工具识别文字,再手动…

2026/8/24 3:16:05 阅读更多 →
机器学习模型演进:从线性回归到多层感知机的核心原理与实战优化

机器学习模型演进:从线性回归到多层感知机的核心原理与实战优化

1. 从线性到非线性:一个机器学习实践者的工具箱演进史如果你刚开始接触机器学习,面对“线性回归”、“Softmax分类”、“多层感知机”这些名词,可能会觉得它们是彼此割裂的算法,需要一个个单独去学。但在我十多年的项目实践中&…

2026/8/24 3:16:05 阅读更多 →
LLM API 上线前 FAQ、故障排查与生产检查清单:小团队如何避免 401、超时和成本失控

LLM API 上线前 FAQ、故障排查与生产检查清单:小团队如何避免 401、超时和成本失控

# LLM API 上线前 FAQ、故障排查与生产检查清单:小团队如何避免 401、超时和成本失控ViralAPI 是面向开发者、小团队和自动化业务场景的 OpenAI-compatible 多模型 API 网关,支持按场景接入 Claude、GPT、Gemini 等模型,并提供不同稳定性与成…

2026/8/24 3:15:05 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →