我們已經逐步介紹以下 TypeScript 的核心型別:
今天要與大家分享 TypeScript 中最後一個核心型別:any
any
型別是 TypeScript 中最靈活的型別之一,它不會對 TypeScript 提供關於值的具體型別資訊。
換句話說,使用 any
型別的變數可以儲存任何型別的值,這使得 any
型別在某些情況下非常有用,但同時也帶來型別安全性方面的風險。
讓我們透過一些範例演示 any
的應用:
如果我們對變數明確指定了型別,然後嘗試將一個不符合該型別的值賦予給它,TypeScript 將產生錯誤。
let num: number = 10;
console.log(num); // 10
num = '肉鬆'; // TypeScript 報錯,類型 'string' 不可指派給類型 'number'
console.log(num); // 肉鬆
any
為例:
let num: any = 10;
console.log(num); // 10
num = '肉鬆'; // TypeScript 不會報錯,num 型別為 any
console.log(num); // 肉鬆
在先前的陣列文章中,我們提到陣列中的元素型別可以透過中括號前面的型別註釋來定義。當我們嘗試將一個不符合該型別的值儲存在陣列中時,TypeScript 將產生錯誤。
let sports: string[];
sports = ['basketball', 'tennis', 5, true];
// 5 => 類型 'number' 不可指派給類型 'string'
// true => 類型 'boolean' 不可指派給類型 'string'
console.log(sports); // ['basketball', 'tennis', 5, true]
any
為例:
let sports: any[];
sports = ['basketball', 'tennis', 5, true]; // TypeScript 不會報錯,sports 型別為 any[]
console.log(sports); // ['basketball', 'tennis', 5, true]
透過上述兩個範例,我們可以得知,即使 console.log
出現正確的輸出,TypeScript 在這之前已經進行了型別檢查並提示型別錯誤。儘管使用 any
型別可以解決這些錯誤,但 any
型別的靈活性同時也降低了 TypeScript 的型別檢查安全性。
因此,我們應避免過度使用和過度依賴 any
型別。取而代之,應盡可能為變數、函式參數、返回值等提供更具體的型別定義。
any
型別確實具有潛在的風險,但在某些情況下,它仍然可以恰當使用,前提是要謹慎且明確使用它,並清楚了解風險所在,以下是一些在 TypeScript 中恰當使用 any
型別的情境:
假設與後端串接或透過外部取得 API 資料,如果無法確定資料的型別。
在這種情況下,我們可以使用 any
型別表示這些資料,確保編輯器不會對資料進行嚴格的型別檢查。
舉例:
const response: any = getUserData();
// 直接訪問 response 的屬性,而不會出現型別錯誤
console.log(response.data.name);
開發可能會引入第三方 JavaScript 函式庫,這些函式庫可能不提供型別定義文件,或者是動態型別的 JavaScript 函式庫,可能需要使用 any
型別來表示輸入或輸出。
舉例:
declare const externalLibraryFunction: any;
const result: any = externalLibraryFunction();
當我們處理動態型別的資料,像是使用 JSON.parse
解析 JSON 資料時,any
型別可以用來表示解析後的物件,因為 JSON 資料可以包含任何型別的值。
舉例:
const data = '{"name": "肉鬆", "age": 30}';
const parsedData: any = JSON.parse(data);
// 現在 parsedData 可以包含任何屬性,編輯器不會進行嚴格的型別檢查
console.log(parsedData.name); // 肉鬆
any
型別是方便又危險的工具,它的主要優點是提供了極高的靈活性,反而降低了 TypeScript 的嚴格型別檢查。any
型別是很重要的,因為這樣才能充分發揮 TypeScript 的優勢。any
型別的時機非常重要。