iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Modern Web

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

Day15 - 解決捉摸不定的資料 - 未知(unknown)

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20230930/201520478PRWbuiej6.png

什麼是 unknown 型別?

unknown 型別是 TypeScript 中的一種型別,它表示一個未知的資料型別。與 any 型別不同,unknown 型別要求我們在使用它之前進行型別檢查或型別斷言。這使得 unknown 更加安全,因為它防止了在運行時引發未定義的錯誤。

使用 unknown 型別的情境

外部資料源

當我們處理來自外部資料(例如:用戶輸入、API 請求或文件讀取)的資料時,我們通常無法確定其型別。這時可以使用 unknown 定義資料型別,有趣的是我們可以在其中儲存任何型別的值不會出錯。

舉例:

let userInput: unknown;

userInput = 30; // 通過
userInput = '肉鬆'; // 通過

當我們宣告一個 userName 變數,它的型別是字串型別,然後試圖將其賦值給 userInput 變數,userInput 的型別是 unknown 時,TypeScript 會產生錯誤。因為 unknown 型別不一定是字串型別,所以 TypeScript 不允許直接將它賦值給字串型別的變數。

let userInput: unknown;
let userName: string;

userInput = 30;
userInput = '肉鬆';

userName = userInput; // TypeScript 報錯,類型 'unknown' 不可指派給類型 'string'

userInput 的型別由 unknown 改為 any 可以讓錯誤消失,因為在 TypeScript 中,any 型別被視為最靈活的型別,它基本上禁用了所有型別檢查。

let userInput: any;
let userName: string;

userInput = 30;
userInput = '肉鬆';

userName = userInput; // 通過

對於 unknown 我們必須先檢查當前儲存在變數中的型別,然後才能將其賦值給需要的變數。

let userInput: unknown;
let userName: string;

userInput = 30;
userInput = '肉鬆';

if (typeof userInput === 'string') {
  userName = userInput;
}

函式返回值

有時我們可能撰寫一個函式,它的返回值的型別依賴於某些輸入。在這種情況下,也可以使用 unknown 型別。

舉例:

function calculateValue(input: unknown): unknown {
  if (typeof input === 'number') {
    return input * input;
  } else {
    return '無效的輸入';
  }
}

const result1 = calculateValue(5);
const result2 = calculateValue('abc');

console.log(result1); // 25
console.log(result2); // 無效的輸入

unknown vs any

  1. 型別安全性:
    • unknown:要求在使用之前進行型別檢查或型別斷言,以確保型別安全。
    • any:不需要型別檢查或型別斷言,允許對變數進行任何操作,可能導致型別不安全。
  2. 型別約束:
    • unknown:更嚴格的型別約束,可以確保型別安全,適用於處理未知型別的情況。
    • any:較鬆散的型別約束,不提供型別安全性,適用於需要繞過型別檢查的情況。
  3. 型別推斷:
    • unknown:當使用 unknown 型別時,變數的型別信息會丟失,需要顯式處理。
    • any:變數的型別信息也會丟失,但不需要顯式處理。
  4. 適用場景:
    • unknown:適用於需要處理未知型別但希望保持型別安全的情況,例如處理外部資料源或動態資料。
    • any:適用於需要繞過型別檢查並且不關心型別安全的情況,或者在遷移現有 JavaScript 程式碼到 TypeScript 時暫時使用。

本日重點

  1. unknown 代表未知的資料型別,你不確定變數的確切型別。
  2. any 不同,unknown 要求我們在使用前進行型別檢查或型別斷言,確保型別安全性。

參考


上一篇
Day14 - 解開函式型別的神秘面紗
下一篇
Day16 - TypeScript 的黑洞 - 絕不(never)
系列文
TypeScript 魔法 - 喚醒你的程式碼靈感30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言