TypeScript - 符号:初学者指南

你好,未来的编程巨星!今天,我们将踏上一段激动人心的旅程,探索TypeScript中的符号世界。如果你之前从未编程过,不用担心——我会成为你的友好向导,我们将一步步探索这个主题。那么,拿起你最喜欢的饮料,让我们开始吧!

TypeScript - Symbols

符号是什么?

在我们深入了解之前,先来了解一下符号是什么。想象你有一个宝箱,你需要一个独特的钥匙来打开它。在TypeScript中,符号就像那些独特的钥匙——它们是特殊的、独一无二的标识符,你可以在代码中使用它们。

语法:如何创建符号

创建一个符号就像做三明治一样简单(甚至可能更简单!)这里是做法:

let mySymbol = Symbol();

就这样!你刚刚创建了你的第一个符号。但等等,还有更多!你也可以给你的符号一个描述:

let namedSymbol = Symbol("这是我的特殊符号");

把这个描述想象成你符号的名牌。它不会影响符号的唯一性,但它可以帮助你以后识别它。

一个小练习

让我们创建两个符号并比较它们:

let symbol1 = Symbol();
let symbol2 = Symbol();

console.log(symbol1 === symbol2); // 输出:false

尽管这两个符号都是没有描述创建的,但它们仍然是唯一的。这就像双胞胎——他们可能看起来一样,但他们是个不同的个体!

符号是唯一且不可变的

现在,让我们来谈谈两个大词:唯一和不可变。

唯一

你创建的每个符号都是独一无二的,就像雪花一样。即使你创建两个带有相同描述的符号,它们仍然是不同的:

let sym1 = Symbol("mySymbol");
let sym2 = Symbol("mySymbol");

console.log(sym1 === sym2); // 输出:false

不可变

一旦你创建了一个符号,你就不能改变它。这就像在石头上刻东西——它是永久存在的。

let immutableSymbol = Symbol("我无法改变");
// 没有办法修改immutableSymbol!

符号作为对象属性的键

关于符号最酷的事情之一是你可以将它们用作对象属性的键。这就像在你的宝箱中有一个只有你知道的秘密隔间!

let specialKey = Symbol("secretCompartment");

let treasureChest = {
[specialKey]: "隐藏的宝藏!",
gold: 100,
silver: 200
};

console.log(treasureChest[specialKey]); // 输出: "隐藏的宝藏!"
console.log(treasureChest.gold); // 输出: 100

在这个例子中,specialKey是一个符号,我们用它来访问treasureChest对象的秘密属性。像gold这样的常规键正常工作,但我们的符号键增加了一层唯一性。

符号与switch语句

符号也可以用在switch语句中。这就像有一个特殊的锁,只有特定的钥匙才能打开:

let actionSymbol = Symbol("action");

switch (actionSymbol) {
case Symbol("action"):
console.log("这不会被记录");
break;
case actionSymbol:
console.log("这会被记录");
break;
default:
console.log("默认情况");
}

记住,即使我们第一个case中有Symbol("action"),它也不是和我们的actionSymbol相同。每个符号都是唯一的!

唯一符号

TypeScript还有一个叫做“唯一符号”的概念。这些更加特殊——它们是TypeScript视为具有完全唯一类型的符号:

const uniqueSymbol: unique symbol = Symbol("我是唯一的!");

// 这是可行的:
let symVar1: typeof uniqueSymbol = uniqueSymbol;

// 这是不可行的:
// let symVar2: unique symbol = Symbol("我也是很独特的!");
// 错误:一个类型为 'unique symbol' 的变量必须是 'const'。

唯一符号必须用const声明,并且不能重新创建。它们就像限量版收藏品——一旦它们消失了,它们就消失了!

处理符号的方法

让我们来看看一些处理符号的便捷方法:

方法 描述 示例
Symbol.for() 在全局符号注册表中创建一个符号 let globalSym = Symbol.for("myGlobalSymbol");
Symbol.keyFor() 在全局符号注册表中检索符号的键 let key = Symbol.keyFor(globalSym);
Object.getOwnPropertySymbols() 返回一个数组,其中包含在给定对象中找到的所有符号属性 let symbols = Object.getOwnPropertySymbols(myObject);

这里是一个如何使用这些方法的快速示例:

let globalSym = Symbol.for("myGlobalSymbol");
console.log(Symbol.keyFor(globalSym)); // 输出: "myGlobalSymbol"

let obj = {
[Symbol("key1")]: "value1",
[Symbol("key2")]: "value2"
};

console.log(Object.getOwnPropertySymbols(obj).length); // 输出: 2

就这样!你刚刚完成了TypeScript符号的速成课程。记住,熟能生巧,所以不要害怕在你的代码中尝试这些概念。谁知道呢?你可能会在途中解锁一些编程超能力!

快乐编程,未来的TypeScript巫师!?‍♂️✨

Credits: Image by storyset