【TypeScript】中的symbol类型

 

目录

 

简介

unique symbol

类型推断


简介

        Symbol 是 ES2015(ES6) 新引入的一种原始类型的值。它类似于字符串,但是每一个 Symbol 值都是独一无二的,与其他任何值都不相等。

        它主要用于创建对象的唯一属性名。在 TypeScript 中,你可以使用 symbol 类型来确保对象属性的唯一性,以及其他与符号相关的操作。

        与其他原始类型(如 number 或 string)不同,symbol 是不可变的且唯一的

 如:

let hiyooo:symbol = Symbol();
let hiyooo1:symbol == Symbel();

hiyooo === hiyooo1  //false
console.log(hiyooo === hiyooo1); // false

unique symbol

  symbol类型包含所有的 Symbol 值,但是无法表示某一个具体的 Symbol 值。

        比如,5是一个具体的数值,就用5这个字面量来表示,这也是它的值类型。但是,Symbol 值不存在字面量,必须通过变量来引用,所以写不出只包含单个 Symbol 值的那种值类型。

        为了解决这个问题,TypeScript 设计了symbol的一个子类型unique symbol,它表示单个的、某个具体的 Symbol 值。

        因为unique symbol表示单个值,所以这个类型的变量是不能修改值的,只能用const命令声明,不能用let声明。

const hiyooo:unique symbol = Symbol();

let hiyooo1:unique symbol = Symbol();//

  const命令为变量赋值 Symbol 值时,变量类型默认就是unique symbol,所以类型可以省略不写。

const x :unique symbol = Symbol();

//等价于

const x = Symbol();

        每个声明为unique symbol类型的变量,它们的值都是不一样的,其实属于两个值类型。

const x = Symbol();  // const x :unique symbol = Symbol();

const y = Symbol(); 

x === y //error 

        不过我们知道,相同参数的Symbol.for()方法会返回相同的 Symbol 值。TypeScript 目前无法识别这种情况,所以可能出现多个 unique symbol 类型的变量,等于同一个 Symbol 值的情况。

const a: unique symbol = Symbol.for("foo");
const b: unique symbol = Symbol.for("foo");

        上面示例中,变量ab是两个不同的值类型,但是它们的值其实是相等的。

unique symbol 类型是 symbol 类型的子类型,所以可以将前者赋值给后者,但是反过来就不行。

const a: unique symbol = Symbol();

const b: symbol = a; // 正确

const c: unique symbol = b; // 报错

        unique symbol 类型的一个作用,就是用作属性名,这可以保证不会跟其他属性名冲突。如果要把某一个特定的 Symbol 值当作属性名,那么它的类型只能是 unique symbol,不能是 symbol。

const x: unique symbol = Symbol();
const y: symbol = Symbol();

interface Foo {
  [x]: string; // 正确
  [y]: string; // 报错
}

类型推断

        如果变量声明时没有给出类型,TypeScript 会推断某个 Symbol 值变量的类型。

  let命令声明的变量,推断类型为 symbol。

  const命令声明的变量,推断类型为 unique symbol。

// 类型为 symbol
let x = Symbol();
// 类型为 unique symbol
const x = Symbol();

        但是,const命令声明的变量,如果赋值为另一个 symbol 类型的变量,则推断类型为 symbol。

let x = Symbol();

// 类型为 symbol
const y = x;

  let命令声明的变量,如果赋值为另一个 unique symbol 类型的变量,则推断类型还是 symbol。

const x = Symbol();

// 类型为 symbol
let y = x;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值