Vue 3 中为插槽定义类型约束的核心方式是通过 defineComponent 的 slots 选项或 defineSlots 宏显式声明参数类型,支持默认、具名、作用域插槽,并可复用接口提升类型安全与可维护性。

在 Vue + TypeScript 项目中,为插槽(Slots)传递的数据定义类型约束,核心是通过 组件的类型声明 明确插槽函数的参数类型,尤其在使用具名插槽、作用域插槽(scoped slots)或 `
使用 `defineComponent` + `slots` 类型声明(推荐 Vue 3)
Vue 3 的 `<script setup>` 中,可通过 `defineComponent` 的 `slots` 选项显式声明每个插槽接收的参数类型。TypeScript 会据此校验插槽内容中使用的变量类型。</script>
- 在组件内部(如 `MyList.vue`)用 `defineComponent` 声明 slots 类型:
export default defineComponent({
name: 'MyList',
props: {
items: { type: Array as PropType
```ts
<script setup lang="ts">
import { defineSlots } from 'vue'
defineSlots<{
default: (props: { item: string; index: number }) => void
header: (props: { title: string }) => void
footer: (props?: { extra: boolean }) => void
}>()
</script>
```
该写法无需 export 组件对象,类型直接参与编译检查,且 `` 中使用 `v-slot` 时,`#default="{ item, index }"` 的解构会被严格校验 —— 若误写成 `item: number`,TS 会报错。
为 `slotProps` 提供接口并复用
当多个组件共享插槽数据结构时,建议提取为独立 interface,提升可维护性与类型复用。
- 创建 `types/slots.ts`:
- 在组件中引用:
注意:普通 `` 不传参时无需类型声明
如果只是透传静态内容(如 `
- 但一旦用了 `v-bind` 或 `v-slot` 解构参数,就必须声明对应类型,否则 TS 会把 `slotProps` 视为 `any`,失去类型保护
- 动态插槽名(如 `#[dynamicName]`)无法静态类型化,需配合 `as const` 或运行时校验兜底
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










