TypeScript - Symbols:初學者的指南

您好,未來的編程超級巨星!今天,我們將踏上一段令人興奮的旅程,探索 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