解释 TypeScript 中的符号类型
Symbol 是在 JavaScript 的最后一个主要修订版 ES6 中引入的。Symbol 是一种数据类型。当我们使用数字、字符串或布尔值来创建不同数据类型的变量时,我们可以使用符号类型来创建符号。
使用符号类型有很多好处,因为它提供了比其他数据类型更多的功能。在本教程中,我们将了解符号的基础知识及其不同的用法。
语法
用户可以按照以下语法创建符号数据类型的变量。
let test_symbol = Symbol(); let key_symbol = Symbol("key-for-symbol");
在上述语法中,我们使用 Symbol() 构造函数创建了符号。我们还可以将键作为符号参数传递以识别符号。
在TypeScript中,我们可以创建多个唯一的符号。这意味着符号是不可变的;即使我们用相同的键创建一个符号,我们也会发现两个符号都是唯一的。
// 使用相同的键创建两个不同的符号。 var first_sym = Symbol("sym"); var second_sym = Symbol("sym"); // 我们无法比较两个符号,因为它们是不可变的 if (first_sym === second_sym) { } else { // 执行流程始终执行此块 }
在上面的代码中,用户可以看到它给出了编译错误,因为这两个符号是无法比较的。
示例 1
在下面的示例中,我们创建了符号,并使用符号的 description 属性来获取我们在创建符号时作为符号参数传递的值。
此外,我们还使用了 toString() 方法将符号转换为字符串。
// 创建符号 const first_sym = Symbol("sym"); const second_sym = Symbol("sym"); // 获取符号的描述 console.log("first_sym 的描述是 " + first_sym.description); // 将符号转换为字符串 console.log("字符串中的符号是 " + first_sym.toString());
编译时,它将在 JavaScript 中生成相同的代码。
输出
它将产生以下输出 −
first_sym 的描述未定义 字符串中的符号是 Symbol(sym)
示例 2:使用符号定义对象属性
在下面的示例中,我们创建了符号并定义了对象。我们将 obj_symbol 用作对象的属性。此外,我们可以像对象的正常属性一样访问它。
const obj_symbol = Symbol(); // 创建对象 let object = { // 使用 obj_symbol 作为对象的键 [obj_symbol]: "obj value", }; // 访问对象的 symbol 属性 console.log( "对象中 obj_symbol 属性的值为 " + object[obj_symbol] );
编译时,它将在 JavaScript 中生成相同的代码。
输出
它将产生以下输出 −
对象中 obj_symbol 属性的值为 obj 值
将 Symbol 与 switch case 语句一起使用
由于每个符号都是唯一的,我们可以将其用作 switch-case 语句的案例。当我们在 switch case 语句中使用符号时,可以确保每个 case 都是唯一的。如果任何 case 与作为 switch 语句的参数传递的 case 不匹配,则转到默认 case。
语法
用户可以按照以下语法在 switch case 语句中使用符号类型。
switch(symbol) { case symbol1: break case symbol2: break; }
在上述语法中,符号作为 switch 语句的参数传递。之后,我们使用符号名称后跟 case 关键字来创建不同的案例。
示例
在下面的示例中,我们创建了四个不同的符号。之后,我们定义了 print_symbol 函数,其中包含 switch case 语句来处理不同的情况。
在 switch case 语句中,我们使用符号值作为案例并执行特定案例的代码。
// 不同的符号 const symbol1 = Symbol(); const symbol2 = Symbol(); const symbol3 = Symbol(); const symbol4 = Symbol(); function print_symbol(symbol) { // 创建 switch case 语句 switch (symbol) { // 不同情况 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."); } } // 调用函数 print_symbol(symbol2); print_symbol(symbol4);
编译时,它将在 JavaScript 中生成相同的代码。
输出
它将产生以下输出 −
案例是符号 2。 案例是符号 4。
唯一符号
在 TypeScript 中,Symbol 是一种原始数据类型。因此,我们只需要将其用作类型,但我们也可以使用"唯一符号"将其用作文字。符号包括唯一符号,这意味着唯一符号是符号的子类型。
我们只能将唯一符号与 const 变量和只读属性一起使用。如果我们想将特定符号类型引用到另一个变量,我们可以使用"typeof"运算符。
语法
用户可以按照以下语法使用唯一符号将符号用作文字。
const test_symbol: unique symbol = Symbol(); let symbol1: typeof test_symbol = test_symbol; class C { static readonly symb: unique symbol = Symbol("unique symbol"); }
示例
在下面的示例中,我们声明了符号类型的 test_symbol,并使用唯一符号关键字将符号用作类型文字。此外,用户可以观察到我们如何使用 typeof 运算符将符号用作使用 let 和 var 关键字声明的变量的类型文字。
此外,我们还使用了 unique symbol 关键字来定义只读静态类成员的类型。
// 在这里,我们使用 unique symbol 来定义 sym1 的类型。 const test_symbol: unique symbol = Symbol(); // 我们不能将 unique symbol 引用到 let 类型的变量 // let sym2: unique symbol = Symbol(); // 使用 typeof 运算符将 symbol 类型引用到使用 let 关键字声明的变量。 let symbol1: typeof test_symbol = test_symbol; console.log("symbol1 的值为 " + typeof test_symbol); // 将 unique symbol 引用到静态类属性 class C { static readonly symb: unique symbol = Symbol("unique symbol"); }
编译后,它将生成以下 JavaScript 代码 -
// 在这里,我们使用唯一符号来定义 sym1 的类型。 var test_symbol = Symbol(); // 我们不能将唯一符号引用到 let 类型的变量 // let sym2: unique symbol = Symbol(); // 使用 typeof 运算符将符号类型引用到使用 let 关键字声明的变量。 var symbol1 = test_symbol; console.log("symbol1 的值为 " + typeof test_symbol); // 将唯一符号引用到静态类属性 var C = /** @class */ (function () { function C() { } C.symb = Symbol("unique symbol"); return C; }());
输出
上述代码将产生以下输出 −
symbol1 的值是 symbol
在本教程中,我们学习了 symbol 类型的基础知识。此外,我们还学会了使用"unique symbol"关键字将 symbol 类型用作类型文字。此外,我们还学会了使用 typeof 运算符来获取另一个变量的 symbol 类型并将其用作另一个变量的类型。