TypeScript Symbol解析
发布时间:2023-03-30 08:49:23 所属栏目:教程 来源:
导读:本节介绍 symbol 类型的语法、使用方法和应用场景,每个从 Symbol() 返回值的唯一性是使用 symbol 类型的最重要原因。
symbol 是一种基本数据类型(primitive data type)。
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 中使用。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
