TypeScript - Symbols:初學者的指南
您好,未來的編程超級巨星!今天,我們將踏上一段令人興奮的旅程,探索 TypeScript Symbols 的世界。別擔心你以前從未編過程——我將成為你的友好導遊,我們將一步步地探索這個主題。所以,拿一杯你喜歡的飲料,我們來一起深入了解一下吧!
Symbols 是什麼?
在我們深入細節之前,讓我們先了解一下 Symbols 是什麼。想象你有一個寶藏箱,你需要一把獨特的鑰匙來打開它。在 TypeScript 中,Symbols 就像那些獨特的鑰匙——它們是特殊的、獨一無二的標識符,你可以在你的代碼中使用。
語法:如何創建 Symbols
創建一個 Symbol 就像做三明治一樣簡單(也許甚至更簡單!)。這樣做:
let mySymbol = Symbol();
就這樣!你已經創建了你的第一個 Symbol。但等等,還有更多!你也可以給你的 Symbol 一個描述:
let namedSymbol = Symbol("這是我的特別符號");
將這個描述看作是你 Symbol 的名牌。它不會影響 Symbol 的唯一性,但它可以幫助你之後識別它。
一個小練習
讓我們創建兩個 Symbols 並比較它們:
let symbol1 = Symbol();
let symbol2 = Symbol();
console.log(symbol1 === symbol2); // 輸出:false
即使兩個 symbols 都是在沒有描述的情況下創建的,它們仍然是最獨特的。這就像雙胞胎——他們可能長得一模一樣,但他們是不同的個體!
Symbols 是唯一且不可變的
現在,讓我們來談論兩個重要的詞:唯一和不可變。
唯一
你創建的每一個 Symbol 都是獨一無二的,就像雪花一樣。即使你創建了兩個帶有相同描述的 Symbols,它們仍然是不同的:
let sym1 = Symbol("mySymbol");
let sym2 = Symbol("mySymbol");
console.log(sym1 === sym2); // 輸出:false
不可變
一旦你創建了一個 Symbol,你就無法改變它。這就像在石頭上雕刻——它是永遠存在的。
let immutableSymbol = Symbol("我無法改變");
// 沒有方法可以修改 immutableSymbol!
使用 Symbols 作為對象屬性的鍵
關於 Symbols 最酷的事情之一是你可以將它們用作對象屬性的鍵。這就像在你的寶藏箱中有一個只有你才知道的秘密隔間!
let specialKey = Symbol("secretCompartment");
let treasureChest = {
[specialKey]: "隱藏的寶藏!",
gold: 100,
silver: 200
};
console.log(treasureChest[specialKey]); // 輸出:"隱藏的寶藏!"
console.log(treasureChest.gold); // 輸出:100
在這個例子中,specialKey
是一個 Symbol,我們用它來訪問我們 treasureChest
對象的秘密屬性。像 gold
這樣的普通鍵正常工作,但我們的 Symbol 鍵增加了一層獨一無二的特性。
在 Switch Case 語句中使用 Symbol
Symbols 也可以用於 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
。每個 Symbol 都是獨一的!
獨一無二的 Symbols
TypeScript 還有一個名為 "unique symbols" 的概念。這些甚至更特別——它們是 TypeScript 視為具有完全獨特類型的 Symbols:
const uniqueSymbol: unique symbol = Symbol("我是獨一無二的!");
// 這可以工作:
let symVar1: typeof uniqueSymbol = uniqueSymbol;
// 這不可以工作:
// let symVar2: unique symbol = Symbol("我也是很獨一無二的!");
// 錯誤:類型為 'unique symbol' 的變量必須是 'const'。
獨一無二的 symbols 必須聲明為 const
,且不能被重新創建。它們就像限量版的收藏品——一旦它們消失了,它們就永遠消失了!
使用 Symbols 的方法
讓我們看一下一些使用 Symbols 的便捷方法:
方法 | 描述 | 示例 |
---|---|---|
Symbol.for() |
在全局 Symbol 登記表中創建一個 Symbol | let globalSym = Symbol.for("myGlobalSymbol"); |
Symbol.keyFor() |
從全局 Symbol 登記表中检索 Symbol 的鍵 | let key = Symbol.keyFor(globalSym); |
Object.getOwnPropertySymbols() |
返回在給定對象中找到的所有 Symbol 屬性的數組 | 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 Symbols 的快速入門課程。記住,熟練才能精通,所以不要害怕在你自己的代碼中嘗試這些概念。也許你會在途中解鎖一些編程超能力!
未來的 TypeScript 巫師,快樂編程!?♂️✨
Credits: Image by storyset