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 类型并将其用作另一个变量的类型。

更新于:2023年1月17日

5K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告