返回
创建于
状态公开
vue3 中可以使用 <script> 标签上的 generic 属性声明泛型类型参数:
1<script setup lang="ts" generic="T">
2defineProps<{
3 items: T[]
4 selected: T
5}>()
6</script>generic 的值与 TypeScript 中位于 <...> 之间的参数列表完全相同。例如,你可以使用多个参数,extends 约束,默认类型和引用导入的类型:
1<script
2 setup
3 lang="ts"
4 generic="T extends string | number, U extends Item"
5>
6import type { Item } from './types'
7defineProps<{
8 id: T
9 list: U[]
10}>()
11</script>当无法自动推断泛型组件的具体类型时,可使用指令 @vue-generic 来显式指定:
1<template>
2 <!-- @vue-generic {import('@/api').Actor} -->
3 <ApiSelect v-model="peopleIds" endpoint="/api/actors" id-prop="actorId" />
4
5 <!-- @vue-generic {import('@/api').Genre} -->
6 <ApiSelect v-model="genreIds" endpoint="/api/genres" id-prop="genreId" />
7</template>为了在 ref 中使用泛型组件的引用,你需要使用 vue-component-type-helpers 库,因为 InstanceType 在这种场景下不起作用。
1<script
2 setup
3 lang="ts"
4>
5import componentWithoutGenerics from '../component-without-generics.vue';
6import genericComponent from '../generic-component.vue';
7
8import type { ComponentExposed } from 'vue-component-type-helpers';
9
10// 适用于没有泛型的组件
11ref<InstanceType<typeof componentWithoutGenerics>>();
12
13ref<ComponentExposed<typeof genericComponent>>();