Vue3 + tsx 如何定义作用域插槽参数的类型?

在 vue3 + ts 中假设我需要一个作用域插槽,并且需要传递一些参数,当使用模版语法时,可以得到正确的ts类型提示。

<script lang="ts" setup>

import { ref } from 'vue';

const data = ref('data')

const content = ref('content')

</script>

<template>

<div>

ScopedSlots

<slot name="content" :data="data" :content="content" />

</div>

</template>

<script setup lang="ts">

import ScopedSlots from '@/components/ScopedSlots.vue';

import ScopedSlotsTSX from '@/components/ScopedSlotsTSX';

</script>

<template>

<main>

HomeView

<ScopedSlots>

<!--

可以得到正确的类型提示

(property) content: {

data: string;

content: string;

}

-->

<template #content="{ data, content }">

{{ data }} {{ content }}

</template>

</ScopedSlots>

</main>

</template>

但是使用 tsx 语法时,以下的写法不能正确的得到类型提示(content 提示为 any):

import { defineComponent, ref } from "vue";

export default defineComponent({

setup (props, { slots }) {

const content = ref("content")

const data = ref("data")

return function render () {

return (

<div>

ScopedSlotsTSX

{ slots.content ? slots.content({ data, content }) : null }

</div>

)

}

}

})

<script setup lang="ts">

import ScopedSlots from '@/components/ScopedSlots.vue';

import ScopedSlotsTSX from '@/components/ScopedSlotsTSX';

</script>

<template>

<main>

HomeView

<ScopedSlotsTSX>

<!-- content 类型显示为 any -->

<template #content="data">

{{ data }}

</template>

</ScopedSlotsTSX>

</main>

</template>

想问下,使用 tsx 时,如何定义作用域插槽传递的参数的类型?

下面是在线预览地址 codesandbox


回答:

vue 官方暂时不支持定义插槽的类型,但是有相关的 rfc。

2023-05-11更新:

3.3.0版本后支持使用 defineSlots 和 slots 来设置插槽的类型:
Support imported types in SFC macros

Setup SFC:

<script setup lang="ts">

const slots = defineSlots<{

default(props: { foo: string; bar: number }): any // or VNode[]

}>()

</script>

Options Api:

import { SlotsType } from 'vue'

defineComponent({

slots: Object as SlotsType<{

default: { foo: string; bar: number }

item: { data: number }

}>,

setup(props, { slots }) {

expectType<undefined | ((scope: { foo: string; bar: number }) => any)>(

slots.default

)

expectType<undefined | ((scope: { data: number }) => any)>(slots.item)

}

})


回答:

不知道楼主最终有没有找到解决方案

我找了一圈只找到了如何在 tsx 中定义插槽的类型,其实用的是选项式API

Vue3 + tsx 如何定义作用域插槽参数的类型?

但这样,在引用这个组件处,还是不能得到插槽的类型提示,我只好在使用处加了类型推导。用 ts 的初衷更多的是类型定义,这样至少能够解决拿不到类型定义的问题,尽管不是很优雅

Vue3 + tsx 如何定义作用域插槽参数的类型?

以上是 Vue3 + tsx 如何定义作用域插槽参数的类型? 的全部内容, 来源链接: utcz.com/p/934089.html

回到顶部