TypeScript 的 symbol 类型精简知识点

一、基础概念与类型声明

  • Symbol 特性:ES2015 引入的原始类型,通过 Symbol() 生成,每个值独一无二。
  • 类型表示:TypeScript 中用 symbol 表示所有 Symbol 值的类型。
    示例:let x: symbol = Symbol();x 和其他 Symbol 值不相等)。

二、unique symbol 子类型

  • 定义symbol 的子类型,用于表示单个具体的 Symbol 值(值类型)。
  • 声明规则
    • 必须用 const 声明(不可修改),let 声明会报错。
      示例:const x: unique symbol = Symbol();(正确);let y: unique symbol = Symbol();(报错)。
    • const 声明时类型可省略,默认推断为 unique symbol(如 const x = Symbol(); 等价于显式声明)。
  • 特性
    • 每个 unique symbol 变量是独立值类型,互不相等(即使都用 Symbol() 生成)。
      示例:const a = Symbol(); const b = Symbol(); a === b 报错(类型不同)。
    • 不可直接赋值给其他 unique symbol 变量,需用 typeof 引用类型。
      示例:const b: typeof a = a;(正确,b 类型与 a 一致)。

三、类型兼容与应用

  • 兼容关系unique symbolsymbol 的子类型,前者可赋值给后者,反之不行。
    示例:const a: unique symbol = Symbol(); const b: symbol = a;(正确);const c: unique symbol = b;(报错)。
  • 应用场景
    • 作为属性名:确保不与其他属性冲突,仅 unique symbol 可用于接口/对象的属性名定义。
      示例:interface Foo { [x]: string }xunique symbol 时正确,symbol 类型报错)。
    • 类的静态只读属性:仅 readonly static 属性可赋值 unique symbol 类型。
      示例:class C { static readonly foo: unique symbol = Symbol(); }

四、类型推断规则

  • let 声明的 Symbol 变量:推断为 symbol 类型(如 let x = Symbol(); 类型为 symbol)。
  • const 声明的 Symbol 变量:直接赋值 Symbol() 时推断为 unique symbol;赋值为其他 symbol 变量时推断为 symbol
    示例:let x = Symbol(); const y = x;y 类型为 symbol)。
  • 注意:Symbol.for() 生成的相同 key 值 Symbol,TypeScript 仍视为不同 unique symbol 类型(无法识别运行时相等性)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值