加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

TypeScript Symbol解析

发布时间:2023-03-30 08:49:23 所属栏目:教程 来源:
导读:本节介绍 symbol 类型的语法、使用方法和应用场景,每个从 Symbol() 返回值的唯一性是使用 symbol 类型的最重要原因。

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

Symbol() 函数会返回 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

当一个对象有较多属性时(往往分布在不同文件中由模块组合而成),很容易将某个属性名覆盖掉,使用 Symbol 值可以避免这一现象,比如 vue-router 中的 name 属性。
// 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 中使用。

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章