以下是原文翻译成繁體中文的版本:

TypeScript - Boxing and Unboxing

# TypeScript - Boxing 和 Unboxing

你好,未來的編程超級巨星!今天,我們將深入TypeScript中的一個令人興奮的主題:Boxing(封裝)和Unboxing(解封)。別擔心這些術語聽起來像是來自拳擊場的東西 – 我保證這個過程遠比拳擊柔和,而且更有趣!讓我們一起開始這場冒險吧。

## Boxing 和 Unboxing 是什麼?

在我們深入TypeScript的細節之前,讓我們先了解在編程中封裝和解封意味著什麼。

想像你有一輛小玩具車。現在,如果你想在移動時保護它,你可能会把它放在一個盒子里。這在編程中基本上就是封裝 – 將一個簡單的值包在一個對象中。

解封,正如你可能猜到的,是相反的過程。這就像把玩具車從盒子里拿出來玩耍。

現在,讓我們看看這在TypeScript中是如何應用的!

## TypeScript中的封裝

在TypeScript中,封裝發生在我們將一個原始值(如數字或字符串)轉換為對象時。這可能聽起來有點奇怪 – 我們為什麼要讓事情變得更複雜?嗯,有時我們需要將這些簡單的值當作對象來使用某些方法或屬性。

讓我們看一些例子:

```typescript
// 封裝一個數字
let myNumber = 42;
let boxedNumber = new Number(myNumber);

console.log(typeof myNumber);    // 輸出: "number"
console.log(typeof boxedNumber); // 輸出: "object"

在這個例子中,我們將我們的簡單數字 42 封裝進一個 Number 對象中。注意 typeof 運算符對每個變量顯示的結果是不同的。

這裡有另一個使用字符串的例子:

// 封裝一個字符串
let myString = "Hello, TypeScript!";
let boxedString = new String(myString);

console.log(myString.toUpperCase());    // 輸出: "HELLO, TYPESCRIPT!"
console.log(boxedString.toUpperCase()); // 輸出: "HELLO, TYPESCRIPT!"

在這種情況下,myStringboxedString 都可以使用 toUpperCase() 方法。TypeScript 足夠智能,當我們在它們上面使用方法時,會自動封裝原始值,所以我們不必總是手動進行。

當封裝有用地?

封裝在當我們使用泛型或需要為我們的值添加附加屬性時特別有用。這裡有一個例子:

function logValue<T>(value: T): void {
    if (typeof value === "object") {
        console.log("對象值:", value);
    } else {
        let boxedValue = Object(value);
        console.log("封裝的原始值:", boxedValue);
    }
}

logValue(42);           // 輸出: 封裝的原始值: [Number: 42]
logValue("TypeScript"); // 輸出: 封裝的原始值: [String: 'TypeScript']
logValue({name: "TypeScript"}); // 輸出: 對象值: { name: 'TypeScript' }

在這個函數中,我們使用封裝來一致地將所有值當作對象處理。

TypeScript中的解封

現在我們已經把值放在盒子里了,我們怎麼把它們拿出來呢?這就是解封發揮作用的地方。解封是從對象包中提取原始值的过程。

在TypeScript中,解封通常在使用封裝值時自動發生,當期望一個原始值的上下文中,你也可以顯式地進行:

let boxedNumber = new Number(42);
let unboxedNumber = boxedNumber.valueOf();

console.log(typeof boxedNumber);  // 輸出: "object"
console.log(typeof unboxedNumber); // 輸出: "number"

在這裡,我們使用了 valueOf() 方法來顯式解封我們的數字。

讓我們再看一個使用字符串的例子:

let boxedString = new String("Hello, TypeScript!");
let unboxedString = boxedString.toString();

console.log(typeof boxedString);  // 輸出: "object"
console.log(typeof unboxedString); // 輸出: "string"

在這種情況下,我們使用了 toString() 來解封我們的字符串。

自動解封

TypeScript(和JavaScript)通常會在我們在某些上下文中使用它們時自動解封值。例如:

let boxedNumber = new Number(42);
let result = boxedNumber + 8;

console.log(result); // 輸出: 50
console.log(typeof result); // 輸出: "number"

即使 boxedNumber 是一個對象,當我們在數學運算中使用它時,TypeScript也會自動解封它。

封裝和解封方法

這裡是一個總結TypeScript中的常用封裝和解封方法的表格:

原始類型 封裝方法 解封方法
number new Number() valueOf()
string new String() toString()
boolean new Boolean() valueOf()

結論

好了,各位!我們已經解開了TypeScript中封裝和解封的神秘。記住,儘管這些概念很重要,但在日常TypeScript編程中,你不必經常手動封裝和解封值。TypeScript和JavaScript都非常擅長為您處理這些轉換。

在你繼續你的TypeScript之旅時,請記住,了解這些底層概念可以幫助你寫出更高效且無錯誤的代碼。這就像知道汽車引擎是如何工作的一樣 – 你不需要那種知識來開車,但在優化性能或診斷問題時,它肯定會有所幫助!

持續編程,持續學習,並記住 – 在編程的世界裡,跳脫思維的盒子是很好,但有時候思考盒子本身也同樣重要!

Credits: Image by storyset