vue3 <script setup lang="ts" generic="T"> 这样的组件如何传入泛型?

作者站长头像
站长
· 阅读数 6
<script setup lang="ts">
    import A from "./A.vue";
<script>

<template>
  <A></A>
</template>

// A.vue
<script setup lang="ts" generic="T">
    ...
<script>
<template>
  ...
</template>

使用的时候在哪里定义T呢?还是这组件不是这样用的?文档地址

回复
1个回答
avatar
test
2024-06-27

不用定义,vue-tsc 会自动推断。

<!-- list.vue -->
<script setup lang="ts" generic="T">
defineProps<{
    data: T[];
}>();

const $emit = defineEmits<{
    (e: 'click-item', item: T): void;
}>();

const handleClickItem = (item: T) {
    $emit('click-item', item);
}
</script>

<template>
    <ul>
        <li v-for="(item, index) in data" :key="index" @click="handleClickItem(item)">
            {{ item }}
        </li>
    </ul>
</template>
<!-- demo.vue -->
<script setup lang="ts">
import { ref } from 'vue';
import List from './list.vue';

const data = ref([
    { id: 1, name: 'a' },
    { id: 2, name: 'b' },
    { id: 3, name: 'c' }
]);
</script>

<template>
    <List :data="data" @click-item="(item) => console.log(item)" />
</template>

此时你鼠标放上去,就能看到类型自动推断了:

answer image


如果非要显式指定泛型也行,但 template 是没办法了,得用 tsx:

<script lang="tsx">
import { defineComponent, ref } from 'vue';
import List from './list.vue';

export default defineComponent({
    setup() {
        type MyItem = { id: number; name: string };
        const data = ref<MyItem[]>([
            { id: 1, name: 'a' },
            { id: 2, name: 'b' },
            { id: 3, name: 'c' }
        ]);

        return () => <List<MyItem> data={data.value} />;
    }
});
</script>
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容