新的知识进入大脑

索引签名和Record

在你需要频繁动态增加属性的场景下,**Record<string, any> 是 Vue3 + TS 里最简洁、最实用、最无坑的写法**,比接口索引签名更省事。


为什么我强烈推荐 Record?

1. 代码极简,不用写 interface

你原本要写:

1
2
3
4
5
interface DynamicData {
a: number
[key: string]: any
}
const re = reactive<DynamicData>({ a:1 })

Record 一行搞定:

1
const re = reactive<Record<string, any>>({ a: 1 })

2. 完美支持频繁新增属性

1
2
3
4
re.b = 2
re.name = "test"
re.list = [1,2,3]
re.obj = { id: 10 }

✅ TS 不报错
✅ 响应式完全正常
✅ 想加什么加什么


3. 最关键:响应式没问题

很多人担心:动态加属性会不会不响应?

只要你用 reactive<Record<string, any>>
Vue 的 Proxy 会自动监听所有新增的属性,完全不用担心。


4. 如果你想要严格一点(不推荐 any)

可以用:

1
2
3
4
// 值只能是 string | number | boolean
const re = reactive<Record<string, string | number | boolean>>({
a: 1
})

最佳实践(直接复制用)

1
2
3
4
5
6
7
8
9
10
11
12
import { reactive } from 'vue'

// 🔥 最推荐:支持任意动态属性 + 响应式 + TS无警告
const re = reactive<Record<string, any>>({
a: 1
})

// 随便加
re.b = 2
re.c = 'hello'
re.user = { name: 'zs' }
re.flag = true

总结

频繁增加属性 → 必须用 Record<string, any>

  • 代码最短
  • TS 最友好
  • 响应式最稳
  • 维护成本最低

这是 Vue3 + TS 动态对象的行业标准写法

withDefaults

withDefaults 是 Vue 3 <script setup> 中配合 TypeScript 使用的一个编译时宏(Compiler Macro),主要作用是为通过 TypeScript 类型声明的 props 提供默认值


核心作用

<script setup> 中,当你使用 TypeScript 的泛型参数来定义 props 类型时,只能定义类型,无法直接设置默认值。withDefaults 就是为了解决这个问题,它允许你在保持类型安全的同时,为 props 指定默认值。


基本用法示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script setup lang="ts">
import { withDefaults } from 'vue'

// 1. 定义 Props 的 TypeScript 接口
interface Props {
msg: string
count?: number // 可选属性
labels: string[]
}

// 2. 使用 withDefaults 包裹 defineProps
const props = withDefaults(defineProps<Props>(), {
// 为可选属性设置默认值
count: 0,
// 注意:对象或数组的默认值必须使用函数返回
labels: () => ['a', 'b']
})
</script>

关键点解析

  1. 无需手动导入:虽然上面的示例写了 import,但实际上 withDefaultsdefineProps 一样,是编译时宏,在 <script setup> 中可以直接使用,不导入也不会报错。
  2. 类型安全:它会确保你提供的默认值与你定义的 TypeScript 类型相匹配,如果类型不匹配,编译时会报错。
  3. 对象/数组默认值:和 Vue 2/3 的普通 props 规则一样,如果默认值是对象数组,必须通过一个函数返回(如上面的 labels: () => ['a', 'b'])。

总结

withDefaults 让你在享受 TypeScript 类型带来的安全感的同时,又能方便地给 props 设置默认值,是 Vue 3 + TypeScript 开发中的常用工具。


新的知识进入大脑
https://cszy.top/20250325-Learn-Ts/
作者
csorz
发布于
2025年3月25日
许可协议