新的知识进入大脑
索引签名和Record
在你需要频繁动态增加属性的场景下,**Record<string, any> 是 Vue3 + TS 里最简洁、最实用、最无坑的写法**,比接口索引签名更省事。
为什么我强烈推荐 Record?
1. 代码极简,不用写 interface
你原本要写:
1 | |
用 Record 一行搞定:
1 | |
2. 完美支持频繁新增属性
1 | |
✅ TS 不报错
✅ 响应式完全正常
✅ 想加什么加什么
3. 最关键:响应式没问题
很多人担心:动态加属性会不会不响应?
只要你用 reactive<Record<string, any>>
Vue 的 Proxy 会自动监听所有新增的属性,完全不用担心。
4. 如果你想要严格一点(不推荐 any)
可以用:
1 | |
最佳实践(直接复制用)
1 | |
总结
频繁增加属性 → 必须用 Record<string, any>
- 代码最短
- TS 最友好
- 响应式最稳
- 维护成本最低
这是 Vue3 + TS 动态对象的行业标准写法。
withDefaults
withDefaults 是 Vue 3 <script setup> 中配合 TypeScript 使用的一个编译时宏(Compiler Macro),主要作用是为通过 TypeScript 类型声明的 props 提供默认值。
核心作用
在 <script setup> 中,当你使用 TypeScript 的泛型参数来定义 props 类型时,只能定义类型,无法直接设置默认值。withDefaults 就是为了解决这个问题,它允许你在保持类型安全的同时,为 props 指定默认值。
基本用法示例
1 | |
关键点解析
- 无需手动导入:虽然上面的示例写了
import,但实际上withDefaults和defineProps一样,是编译时宏,在<script setup>中可以直接使用,不导入也不会报错。 - 类型安全:它会确保你提供的默认值与你定义的 TypeScript 类型相匹配,如果类型不匹配,编译时会报错。
- 对象/数组默认值:和 Vue 2/3 的普通 props 规则一样,如果默认值是对象或数组,必须通过一个函数返回(如上面的
labels: () => ['a', 'b'])。
总结
withDefaults 让你在享受 TypeScript 类型带来的安全感的同时,又能方便地给 props 设置默认值,是 Vue 3 + TypeScript 开发中的常用工具。
新的知识进入大脑
https://cszy.top/20250325-Learn-Ts/