iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
Modern Web

TypeScript 魔法 - 喚醒你的程式碼靈感系列 第 8

Day08 - 方便又危險的型別 - 任何(any)

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20230923/20152047VdOOKC0z3d.png

我們已經逐步介紹以下 TypeScript 的核心型別:

  • number
  • string
  • boolean
  • object
  • Array
  • Tuples
  • Enums

今天要與大家分享 TypeScript 中最後一個核心型別:any

any 型別是 TypeScript 中最靈活的型別之一,它不會對 TypeScript 提供關於值的具體型別資訊。
換句話說,使用 any 型別的變數可以儲存任何型別的值,這使得 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 型別的情境

any 型別確實具有潛在的風險,但在某些情況下,它仍然可以恰當使用,前提是要謹慎且明確使用它,並清楚了解風險所在,以下是一些在 TypeScript 中恰當使用 any 型別的情境:

處理來自 API 的資料

假設與後端串接或透過外部取得 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); // 肉鬆

本日重點

  1. any 型別是方便又危險的工具,它的主要優點是提供了極高的靈活性,反而降低了 TypeScript 的嚴格型別檢查。
  2. 避免過度使用 any 型別是很重要的,因為這樣才能充分發揮 TypeScript 的優勢。
  3. 恰當使用 any 型別的時機非常重要。

參考


上一篇
Day07 - 定義常數集合的好幫手 - 枚舉(Enums)
下一篇
Day09 - 型別們,聯合吧!(Union Types)
系列文
TypeScript 魔法 - 喚醒你的程式碼靈感30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
秘密基地
iT邦新手 4 級 ‧ 2023-09-23 09:27:04

太危險了

我要留言

立即登入留言