iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

在昨天的範例中,應該有看到斷言的用法。斷言是一種告訴編譯器更多資訊的方式,用於 強制指定型別。有時候,編譯器可能 無法確定變數的精確型別,或者 當我們需要將某個值視為不同的型別進行操作時,這時我們可以用斷言來強制指定型別,以便更好地支援開發上的需求。

斷言寫法

斷言有兩種寫法:as 型別<型別> (Angle bracket)

let unknownValue: unknown; // 須為 any 或 unknown 才可進行斷言
unknownValue = "威爾豬"; // 假設後來會取得的值為字串

let unknownValueLength1: number = (unknownValue as string).length; // as 寫法
let unknownValueLength2: number = (<string>unknownValue).length; // <> 寫法

這兩種寫法是一樣的,威爾豬自己是使用 as 比較多,大家可以根據團隊或自己喜好選擇其中一種來使用。

斷言通常在以下情況下使用:

  • 當我們比編譯器更 確定變數的型別 時,可以使用斷言告訴編譯器正確的型別。
let userInput: unknown = "123";
let numberValue: number = userInput as number; // 強制斷言為 number 型別
  • 當我們處理 JavaScript 函式庫或第三方模組時,可能需要 對外部資料進行斷言,以確保正確的型別處理。
interface IData {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
}

const getData = async (id: number = 1): Promise<void> => {
  const res: any = await fetch(
    `https://jsonplaceholder.typicode.com/todos/${id}`
  );
  const data: IData = (await res.json()) as IData; // 強制斷言為 IData 型別
};

應用範例

假設我們正在開發一個圖書管理系統,並且從用戶輸入中獲取書籍的 ISBN 編號。我們希望將用戶輸入的內容斷言為數字型別,以便後續處理:

let userInput: unknown = "9783161484100";
let isbn: number = userInput as number; // 故意轉換

console.log(typeof isbn); // 輸出 string

在這個例子中,我們使用斷言將 userInput 變數的型別從 unknown 斷言為 number,並賦予到 isbn 變數上。不過我們使用 typeof 去查看 isbn 變數的型別,它還是會顯示為 string,我們看編譯後的 js 檔就會知道了:

https://ithelp.ithome.com.tw/upload/images/20230910/20141250jbLoqL3tP0.png

原因是 斷言只是在編譯時提供一個提示,並不會改變值的真實型別

因此,如果我們要確實改變型別,就需要使用 強制轉型。看以下範例:

let userInput: unknown = "9783161484100";
let isbn: number = Number(userInput as number); // 強制轉型為 number 型別

console.log(typeof isbn); //輸出 number

透過 Number() 來強制轉換型別後,我們再看看編譯後的 js 檔:

https://ithelp.ithome.com.tw/upload/images/20230910/20141250n4FTzQHKiQ.png

這樣 isbn 的型別確實會轉換為 number 型別了。

斷言注意事項

雖然斷言是一種強大的工具,但使用不當可能導致運行時發生錯誤,因此,我們需要注意以下幾點事項:

  • 斷言是一種告訴編譯器的指令,它只是一個提示,並 不會影響 JavaScript 在執行時的行為,但錯誤的斷言可能導致運行錯誤。

  • 使用斷言時,請 確保對變數的型別有準確的了解,不正確使用斷言可能會影響程式碼的品質和可靠性。


所以斷言要謹慎使用,因為它是一種繞過 TypeScript 型別檢查的方式,如果斷言的型別與實際值的型別不符,可能會導致運行時錯誤,只有在我們確定某個值的型別時或需要某個不確定的值成為特定的型別時,才應該使用斷言。此外,如果我們使用了斷言,也最好註解為什麼需要用到斷言,以及確保此斷言是安全和合理的行為。


上一篇
任意型別 VS. 未知型別 (any VS. unknown)
下一篇
類型別名 (Type)
系列文
用不到 30 天學會基本 TypeScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言