unknown
型別是 TypeScript 中的一種型別,它表示一個未知的資料型別。與 any
型別不同,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
unknown
:要求在使用之前進行型別檢查或型別斷言,以確保型別安全。any
:不需要型別檢查或型別斷言,允許對變數進行任何操作,可能導致型別不安全。unknown
:更嚴格的型別約束,可以確保型別安全,適用於處理未知型別的情況。any
:較鬆散的型別約束,不提供型別安全性,適用於需要繞過型別檢查的情況。unknown
:當使用 unknown
型別時,變數的型別信息會丟失,需要顯式處理。any
:變數的型別信息也會丟失,但不需要顯式處理。unknown
:適用於需要處理未知型別但希望保持型別安全的情況,例如處理外部資料源或動態資料。any
:適用於需要繞過型別檢查並且不關心型別安全的情況,或者在遷移現有 JavaScript 程式碼到 TypeScript 時暫時使用。unknown
代表未知的資料型別,你不確定變數的確切型別。any
不同,unknown
要求我們在使用前進行型別檢查或型別斷言,確保型別安全性。