TypeScript 中的 Symbol 类型
Symbol 是在 JavaScript 的最新主要版本 ES6 中引入的。Symbol 是一种数据类型。就像我们使用数字、字符串或布尔值来创建不同数据类型的变量一样,我们可以使用 Symbol 类型来创建 Symbol。
使用 Symbol 类型有很多好处,因为它提供了比其他数据类型更多的功能。在本教程中,我们将学习 Symbol 的基础知识及其不同用途。
语法
用户可以按照以下语法创建 Symbol 数据类型的变量。
let test_symbol = Symbol(); let key_symbol = Symbol("key-for-symbol");
在上述语法中,我们使用 Symbol() 构造函数创建了 Symbol。我们还可以将键作为 Symbol 参数传递以识别 Symbol。
在TypeScript中,我们可以创建多个唯一的 Symbol。这意味着 Symbol 是不可变的;即使我们使用相同的键创建 Symbol,我们也可以发现这两个 Symbol 都是唯一的。
// Creating two different symbols with the same key. var first_sym = Symbol("sym"); var second_sym = Symbol("sym"); // we can't compare two symbols as they are immutable if (first_sym === second_sym) { } else { // execution flow always executes this block }
在上面的代码中,用户可以看到它会产生编译错误,因为这两个 Symbol 是不可比较的。
示例 1
在下面的示例中,我们创建了 Symbol 并使用了 Symbol 的 description 属性来获取我们在创建 Symbol 时作为 Symbol 参数传递的值。
此外,我们使用了 toString() 方法将 Symbol 转换为字符串。
// Creating the symbols const first_sym = Symbol("sym"); const second_sym = Symbol("sym"); // getting the description of the symbol console.log("The description of the first_sym is " + first_sym.description); // converting symbols to string console.log("The symbol in the string is " + first_sym.toString());
编译后,它将在 JavaScript 中生成相同的代码。
输出
它将产生以下输出:
The description of the first_sym is undefined The symbol in the string is Symbol(sym)
示例 2:使用 Symbol 定义对象属性
在下面的示例中,我们创建了 Symbol 并定义了对象。我们使用 obj_symbol 作为对象的属性。此外,我们可以像访问对象的普通属性一样访问它。
const obj_symbol = Symbol(); // creating the object let object = { // using the obj_symbol as key of object [obj_symbol]: "obj value", }; // accessing the symbol property of the object console.log( "The vlaue of the obj_symbol property in the object is " + object[obj_symbol] );
编译后,它将在 JavaScript 中生成相同的代码。
输出
它将产生以下输出:
The vlaue of the obj_symbol property in the object is obj value
在 switch case 语句中使用 Symbol
由于每个 Symbol 都是唯一的,因此我们可以将其用作 switch-case 语句的 case。当我们在 switch case 语句中使用 Symbol 时,它确保每个 case 都是唯一的。如果任何 case 与作为 switch 语句参数传递的 case 不匹配,则它将转到 default case。
语法
用户可以按照以下语法在 switch case 语句中使用 Symbol 类型。
switch(symbol) { case symbol1: break case symbol2: break; }
在上述语法中,一个 Symbol 作为 switch 语句的参数传递。之后,我们使用 Symbol 名称后跟 case 关键字来创建不同的 case。
示例
在下面的示例中,我们创建了四个不同的 Symbol。之后,我们定义了 print_symbol 函数,其中包含 switch case 语句来处理不同的 case。
在 switch case 语句中,我们使用 Symbol 值作为 case 并执行特定 case 的代码。
// different symbols const symbol1 = Symbol(); const symbol2 = Symbol(); const symbol3 = Symbol(); const symbol4 = Symbol(); function print_symbol(symbol) { // creating the switch case statement switch (symbol) { // different cases case symbol1: console.log("The case is symbol 1."); break; case symbol2: console.log("The case is symbol 2."); break; case symbol3: console.log("The case is symbol 3."); debugger; break; case symbol4: console.log("The case is symbol 4."); break; default: console.log("The case is default."); } } // calling the function print_symbol(symbol2); print_symbol(symbol4);
编译后,它将在 JavaScript 中生成相同的代码。
输出
它将产生以下输出:
The case is symbol 2. The case is symbol 4.
唯一 Symbol
在TypeScript中,Symbol 是一种原始数据类型。因此,我们只需要将其用作类型,但我们也可以使用“唯一 Symbol”将其用作字面量。Symbol 包括唯一 Symbol,这意味着唯一 Symbol 是 Symbol 的子类型。
我们只能将唯一 Symbol 用于 const 变量和只读属性。如果我们想将特定的 Symbol 类型引用到另一个变量,我们可以使用“typeof”运算符。
语法
用户可以按照以下语法使用 Symbol 作为字面量使用唯一 Symbol。
const test_symbol: unique symbol = Symbol(); let symbol1: typeof test_symbol = test_symbol; class C { static readonly symb: unique symbol = Symbol("unique symbol"); }
示例
在下面的示例中,我们声明了类型为 Symbol 的 test_symbol 并使用 unique symbol 关键字将 Symbol 用作类型字面量。此外,用户可以观察我们如何使用 typeof 运算符将 Symbol 用作使用 let 和 var 关键字声明的变量的类型字面量。
此外,我们使用 unique symbol 关键字定义了只读静态类的成员的类型。
// here, we used the unique symbol to define the type of the sym1. const test_symbol: unique symbol = Symbol(); // we can't reference the unique symbol to the let type of variable // let sym2: unique symbol = Symbol(); // to reference the symbol type to the variables declared with the let keyword, using the typeof operator. let symbol1: typeof test_symbol = test_symbol; console.log("The value of symbol1 is " + typeof test_symbol); // referencing the unique symbol to the static class property class C { static readonly symb: unique symbol = Symbol("unique symbol"); }
编译后,它将生成以下 JavaScript 代码:
// here, we used the unique symbol to define the type of the sym1. var test_symbol = Symbol(); // we can't reference the unique symbol to the let type of variable // let sym2: unique symbol = Symbol(); // to reference the symbol type to the variables declared with the let keyword, using the typeof operator. var symbol1 = test_symbol; console.log("The value of symbol1 is " + typeof test_symbol); // referencing the unique symbol to the static class property var C = /** @class */ (function () { function C() { } C.symb = Symbol("unique symbol"); return C; }());
输出
以上代码将产生以下输出:
The value of symbol1 is symbol
在本教程中,我们学习了 Symbol 类型的基础知识。此外,我们学习了如何使用“unique symbol”关键字将 Symbol 类型用作类型字面量。此外,我们学习了如何使用 typeof 运算符获取另一个变量的 Symbol 类型并将其用作另一个变量的类型。