Vue 3 TypeScript Props 設定:withDefaults 與解構賦值
在 Vue 3 的 <script setup> 中,如果你使用 TypeScript 的介面 (Interface) 來定義 Props,你會發現傳統的 JavaScript 預設值寫法行不通。這就是 withDefaults 大顯身手的時候。
為什麼需要 withDefaults?
JavaScript vs TypeScript 的差異
在純 JavaScript 中,你可以很直覺地寫:
const props = defineProps({
title: { type: String, default: "My Profile" },
});
但在 TypeScript 的 型別宣告模式 下,當你使用 defineProps<Props>() 時:
- 不使用
withDefaults: 你只能定義title?: string(可選),但如果父組件沒傳,值就會是undefined。 - 使用
withDefaults: 你可以確保即使父組件沒傳,變數也會有一個正確的預設值。
編譯時 vs 運行時的差異
當你使用「編譯時指令」defineProps<Props>() 時,TypeScript 只能幫你檢查型別,但無法直接賦予初始值。withDefaults 就是專門用來為這些型別定義的 Props 設定預設值的工具。
特別注意: 對於陣列 (Array) 或 物件 (Object) 的預設值,必須使用一個 Factory Function (箭頭函式) 回傳值:
tabs: () => []。這是為了避免多個組件實例共用同一個記憶體位址的資料。
基本用法
方法一:定義 Interface(最推薦)
這是最乾淨的做法,將型別定義與邏輯分開。
// 1. 先定義 Props 的結構
interface Props {
title?: string; // 問號代表選填
tabs: string[]; // 強制要求字串陣列
count?: number;
}
// 2. 將 Interface 傳入 defineProps
const props = withDefaults(defineProps<Props>(), {
title: "My Profile",
tabs: () => [], // 物件或陣列預設值需用 Factory Function
count: 0,
});