unique symbol
TypeScript 设计了symbol的一个子类型unique symbol,它表示单个的、某个具体的 Symbol 值。
这个类型的变量是不能修改值的,只能用const命令声明,不能用let声明。
const命令为变量赋值 Symbol 值时,变量类型默认就是unique symbol,所以类型可以省略不写。
const a:unique symbol = Symbol();
const b:typeof a = a; // 正确
相同参数的Symbol.for()方法会返回相同的 Symbol 值。TypeScript 目前无法识别这种情况,所以可能出现多个 unique symbol 类型的变量,等于同一个 Symbol 值的情况。
const a:unique symbol = Symbol.for('foo');
const b:unique symbol = Symbol.for('foo');
unique symbol 类型是 symbol 类型的子类型,所以可以将前者赋值给后者,但是反过来就不行。
const a:unique symbol = Symbol();
const b:symbol = a; // 正确
const c:unique symbol = b; // 报错
unique symbol 类型的一个作用,就是用作属性名,这可以保证不会跟其他属性名冲突。
unique symbol类型也可以用作类(class)的属性值,但只能赋值给类的readonly static属性。
class C {
static readonly foo:unique symbol = Symbol();
}
类型推断
const命令声明的变量,如果赋值为另一个 symbol 类型的变量,则推断类型为 symbol。
let x = Symbol();
// 类型为 symbol
const y = x;
let命令声明的变量,如果赋值为另一个 unique symbol 类型的变量,则推断类型还是 symbol。
const x = Symbol();
// 类型为 symbol
let y = x;