您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

TypeScript Symbol

本节介绍 symbol 类型的语法、使用和应用场景,每个从 Symbol() 返回值的唯一性是使用 symbol 类型的最重要原因。

symbol 是一种基本数据类型(primitive data type)。

Symbol() 会返回 symbol 类型的值。每个从 Symbol() 返回的 symbol 值都是唯一的。

Symbol([description])

参数 description:可选的,字符串类型。

使用 Symbol() 创建新的 symbol 类型:

const sym1: symbol = Symbol()
const sym2: symbol = Symbol('foo')
const sym3: symbol = Symbol('foo')

上面的创建了三个新的 symbol 类型,但要注意每个从 Symbol() 返回的值都是唯一的:

console.log(sym2 === sym3) // false

解释: 每个 Symbol() 返回的值都是唯一的,所以,sym2 和 sym3 不相等。

Symbol() 作为构造是不完整的:

const sym = new Symbol() // TypeError

这种语法会报错,是因为从 ECMAScript 6 开始围绕原始数据类型创建显式包装器对象已不再被,但因历史遗留原因, new Boolean()new String() 以及 new Number() 仍可被创建:

const symbol = new Symbol()   // TypeError
const bigint = new BigInt()   // TypeError

const number = new Number()   // OK
const boolean = new Boolean() // OK
const string = new String()   // OK
// a.js 
export const aRouter = {
  path: '/index',
  name: Symbol('index'),
  component: Index
},

// b.js 

export const bRouter = {
  path: '/home',
  name: Symbol('index'), // 不重复
  component: Home
},

// routes.js 
import { aRouter } from './a.js'
import { bRouter } from './b.js'

const routes = [
  aRouter,
  bRouter
]

解释: 两个不同使用了同样的 Symbol('index') 作为 name 的值,因 symbol 类型的唯一性,就避免了重复定义。

const permission: symbol = Symbol('permission')

class Auth {
  [permission]() {
    // do something
  }
}

这种情况通过类的实例是无法取到该,模拟类的私有。

但是,TypeScript 是可以使用 private 关键字的,所以这种可以在 JavaScript 中使用。

if (Symbol.iterator in iterable) {
    for(let n of iterable) {
      console.log(n)
    }
}

这个知识点后续会在 迭代器 那一节会着重介绍,这里可以先知晓:

Symbol([description]) 中可选的字符串即为这个 Symbol 的描述,如果想要这个描述:

const sym: symbol = Symbol('imooc')

console.log(sym);               // Symbol(imooc)
console.log(sym.toString());    // Symbol(imooc)
console.log(sym.description);   // imooc

TIPS: description 是 ES2019 的新标准,Node.js 最低版本 11.0.0

本节介绍了 Symbol 一些常见的使用,虽然较少使用,但在特定场景非常有用。


联系我
置顶