any 跟 unknown
什麼是 any 型別?
- 關閉型別檢查
- 可以被賦任何值,任何操作都不會報錯
let count: any = 3;
count = "5";
count.toFixed();
在編譯的時候不會報錯 (不檢查) ,直到瀏覽器運行的時候才會
什麼是 unknown 型別?
- 安全版的 any
- 可以賦值,但不能直接使用(讀屬性、呼叫、運算)
使用方式 1:型別檢查 (推薦)
const price: unknown = 1458694;
// price.toFixed(); 會報錯
if (typeof price === "number") {
price.toFixed(); // 檢查型別之後就可以使用
}
使用方式 2:型別斷言 (as)
const price: unknown = 1458694;
// 使用斷言告訴 TypeScript 你確定這個值的型別
const numPrice = price as number;
numPrice.toFixed(); // 可以直接使用
// 或直接在使用時斷言
(price as number).toFixed();
注意:斷言只是告訴 TypeScript 編譯器你確信型別,但不會在運行時檢查。如果型別不正確,運行時仍可能出錯。
實作範例
function parse(json: string): unknown {
return JSON.parse(json); // JSON.parse 回傳型別太寬,先用 unknown 保守處理
}
// 呼叫端:先檢查型別再操作
const data: unknown = parse(raw);
if (typeof data === 'object' && data !== null && 'name' in data) {
// 這裡才能安全地存取
const name = (data as { name: string }).name;
}