一、基础概念与类型声明
- 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 symbol
是symbol
的子类型,前者可赋值给后者,反之不行。
示例:const a: unique symbol = Symbol(); const b: symbol = a;
(正确);const c: unique symbol = b;
(报错)。 - 应用场景:
- 作为属性名:确保不与其他属性冲突,仅
unique symbol
可用于接口/对象的属性名定义。
示例:interface Foo { [x]: string }
(x
为unique 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
类型(无法识别运行时相等性)。