TypeScript 中的 any 和 Object


TypeScript 是一種功能強大的、靜態型別的 JavaScript 超集,它為 JavaScript 開發帶來了額外的功能和優勢。TypeScript 中兩種常用的型別是 any 和 object。在本教程中,我們將深入探討 TypeScript 中 any 和 object 的概念,並探索它們如何在各種場景中使用。我們將提供清晰的語法解釋、程式碼示例及其相應的輸出,以幫助初學者有效地掌握這些概念。

any 型別

any 型別是 TypeScript 中的一種特殊型別,它允許變數儲存任何型別的值。它透過繞過靜態型別檢查來提供靈活性,這在某些情況下非常有用。但是,過度使用 any 會削弱使用 TypeScript 型別系統的優勢。在處理動態值或變數型別可能在執行時發生變化的情況下,any 型別可能很有用。

示例 1

在本例中,變數 dynamicValue 使用 any 型別宣告。它可以分配不同型別的值,例如數字、字串或布林值。由於 any 型別繞過了型別檢查,因此編譯器允許將任何型別的值分配給變數。因此,變數可以在執行時儲存不同型別的值。

let dynamicValue: any;
dynamicValue = 42; 
console.log(dynamicValue);

dynamicValue = 'Hello, TypeScript!';
console.log(dynamicValue);

dynamicValue = true;
console.log(dynamicValue);

編譯後,它將生成以下 JavaScript 程式碼:

var dynamicValue;
dynamicValue = 42;
console.log(dynamicValue);
dynamicValue = 'Hello, TypeScript!';
console.log(dynamicValue);
dynamicValue = true;
console.log(dynamicValue);

輸出

以上程式碼將產生以下輸出:

42
Hello, TypeScript!
true

示例 2

在本例中,函式 processValue 接受一個 any 型別的引數。它可以接收任何型別的引數,並且值會直接輸出。這種靈活性在確切的值型別未知或可能變化的情況下非常有用。

function processValue(value: any): void {
   console.log(value);
}
processValue(95); 
processValue('Kachow! McQueen!'); 
processValue(false);

編譯後,它將生成以下 JavaScript 程式碼:

function processValue(value) {
   console.log(value);
}
processValue(95);
processValue('Kachow! McQueen!');
processValue(false);

輸出

以上程式碼將產生以下輸出:

95
Kachow! McQueen!
false

Object 型別

TypeScript 中的 object 型別表示非原始型別。與 any 型別相比,它更受約束,因為它只允許非 null 或 undefined 的值。在 TypeScript 中使用物件時,通常會使用 object 型別。在處理動態值或變數型別可能在執行時發生變化的情況下,any 型別可能很有用。

示例 1

在本例中,我們有一個函式 printPerson,它接受一個 object 型別的引數。該函式將 person 物件記錄到控制檯。我們定義了一個物件 john,它具有 name 和 age 屬性,然後將其作為引數傳遞給 printPerson 函式。TypeScript 編譯器確保 person 引數僅接受 object 型別或其子型別的值。

function printPerson(person: object): void {
   console.log(person);
}
const john: object = {
   name: 'Jim Carey',
   age: 25,
};
printPerson(john);

編譯後,它將生成以下 JavaScript 程式碼:

function printPerson(person) {
   console.log(person);
}
var john = {
   name: 'Jim Carey',
   age: 25
};
printPerson(john);

輸出

以上程式碼將產生以下輸出:

{ name: 'Jim Carey', age: 25 }

示例 2

在本例中,我們定義了一個介面 Car,它表示汽車物件的結構。printCar 函式採用 object 型別的物件作為引數。然後,我們建立一個符合 Car 介面的物件 myCar,並將其傳遞給 printCar 函式。雖然 myCar 的型別為 Car,但由於 Car 和 object 之間的結構相容性,它可以作為引數傳遞給期望 object 型別的函式。

interface Car {
   brand: string;
   model: string;
   year: number;
}

function printCar(car: object): void {
   console.log(car);
}

const myCar: Car = {
   brand: 'Toyota',
   model: 'Supra',
   year: 2019,
};

printCar(myCar);

編譯後,它將生成以下 JavaScript 程式碼:

function printCar(car) {
   console.log(car);
}
var myCar = {
   brand: 'Toyota',
   model: 'Supra',
   year: 2019
};
printCar(myCar);

輸出

以上程式碼將產生以下輸出:

{ brand: 'Toyota', model: 'Supra', year: 2019 }

使用 any 與 Object

在決定使用 any 和 object 之間時,務必考慮程式碼中所需的型別安全級別。

any 型別提供了最大的靈活性,允許變數儲存任何型別的值。但是,這種靈活性是以失去型別安全性和靜態型別的優勢為代價的。建議謹慎使用 any,並且僅在必要時使用,例如在處理動態值或整合現有 JavaScript 庫時。

另一方面,object 型別透過將變數限制為非原始型別來提供一定程度的約束。它允許您定義物件的結構並執行型別檢查。雖然與 any 相比它提供了更高的型別安全,但在處理不同型別的值時可能不如它靈活。

通常最好利用 TypeScript 的型別系統,並在可能的情況下使用特定型別,而不是使用 any 或 object。這確保了更強的型別檢查,並有助於在開發過程的早期捕獲潛在的錯誤。

結論

在 TypeScript 中,any 型別允許變數儲存任何型別的值,從而提供了以型別安全為代價的靈活性。另一方面,object 型別表示非原始型別,並且通常在使用物件時使用。通過了解 any 和 object 的差異和適當用法,開發人員可以在 TypeScript 專案中在靈活性與型別安全之間取得平衡。請記住,謹慎使用 any,並在可能的情況下首選更具體的型別,以利用 TypeScript 靜態型別的優勢。

更新於: 2023-09-04

3K+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.