You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte+TS中如何为Accordion组件组设置类型?

在SvelteKit+TS中实现带子组件的Accordion导出

要实现你期望的Accordion+Accordion.Item的使用方式,同时让TypeScript正确识别类型,按以下步骤操作:

1. 基础组件实现

先分别写好Accordion.svelte和AccordionItem.svelte的核心逻辑,同时定义各自的Props:

Accordion.svelte

<script lang="ts">
  // 定义Accordion的Props
  export let openIndex: number | null = 0;
</script>

<div class="accordion">
  <slot />
</div>

AccordionItem.svelte

<script lang="ts">
  // 定义AccordionItem的Props
  export let title: string;
</script>

<div class="accordion-item">
  <h3>{title}</h3>
  <div class="content">
    <slot />
  </div>
</div>

2. 类型扩展与导出

在组件目录下创建index.ts文件,负责合并组件并添加正确的类型标注:

import Accordion from './Accordion.svelte';
import AccordionItem from './AccordionItem.svelte';

// 定义扩展类型:合并原Accordion组件类型与Item属性
type AccordionWithItem = typeof Accordion & {
  Item: typeof AccordionItem;
};

// 给Accordion添加Item属性,并通过类型断言让TS识别扩展后的类型
const ExtendedAccordion = Accordion as AccordionWithItem;
ExtendedAccordion.Item = AccordionItem;

// 导出合并后的组件,对外暴露统一的Accordion名称
export { ExtendedAccordion as Accordion };

3. 使用方式

现在可以按你期望的方式导入并使用,TypeScript会自动识别Accordion.Item的类型,不会报错:

<script lang="ts">
  import { Accordion } from '$lib/components/Accordion';
</script>

<Accordion openIndex={1}>
  <Accordion.Item title="第一面板">
    这是第一面板的内容
  </Accordion.Item>
  <Accordion.Item title="第二面板">
    这是第二面板的内容
  </Accordion.Item>
</Accordion>

关键说明

Svelte组件的默认导出类型是Component(基于Svelte内部类型),直接给它添加静态属性时TypeScript会因为原类型不包含该属性而报错。通过交叉类型合并+类型断言的方式,我们可以告诉TypeScript:这个Accordion组件不仅有原有的类型,还带有Item这个子组件属性。

内容的提问来源于stack exchange,提问作者barbajoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:05:17