TypeScript - 符号:初学者指南
你好,未来的编程巨星!今天,我们将踏上一段激动人心的旅程,探索TypeScript中的符号世界。如果你之前从未编程过,不用担心——我会成为你的友好向导,我们将一步步探索这个主题。那么,拿起你最喜欢的饮料,让我们开始吧!
符号是什么?
在我们深入了解之前,先来了解一下符号是什么。想象你有一个宝箱,你需要一个独特的钥匙来打开它。在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