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

如何重写SvelteComponent类型以支持未声明的组件属性?

为所有Svelte组件全局添加自定义属性解决TypeScript报错问题

我知道这并非Svelte的常规使用场景,但希望应用中的所有组件都能接收一个未通过export let声明的属性。示例代码如下:

组件示例

Hello.svelte

<script lang="ts">
  export let name;
</script>
<h1>Hello {name}</h1>

Goodbye.svelte

<script lang="ts">
  export let name;
</script>
<h1>Goodbye {name}</h1>

App.svelte

<script lang="ts">
  import Hello from './Hello.svelte';
  import Goodbye from './Goodbye.svelte';
</script>
<Hello name="john" special-prop={true} />
<Goodbye name="jack" special-prop={false}  />

此时typescript和svelte-check会针对special-prop报错,需要重写SvelteComponent类型以支持special-prop?: boolean这个全局属性。

解决方案

方法1:扩展SvelteComponentTyped类型

在项目根目录的src/global.d.ts(SvelteKit项目为src/app.d.ts)中添加以下类型声明:

import type { SvelteComponentTyped } from 'svelte';

declare module 'svelte' {
  interface SvelteComponentTyped<
    Props = Record<string, any>,
    Events = Record<string, any>,
    Slots = Record<string, any>
  > {
    new (options: {
      target: Element | Document | ShadowRoot;
      anchor?: Element;
      props?: Props & { 'special-prop'?: boolean };
      context?: Map<any, any>;
      hydrate?: boolean;
      intro?: boolean;
    }): any;
  }
}

方法2:扩展ComponentProps类型(Svelte 4+)

如果使用Svelte 4及以上版本,可直接扩展ComponentProps来实现全局属性支持:

declare module 'svelte' {
  interface ComponentProps<T extends Component> {
    'special-prop'?: boolean;
  }
}

后续操作

  1. 保存声明文件后,重启编辑器或TypeScript语言服务
  2. 确保tsconfig.json的include数组包含该声明文件,比如:
{
  "include": ["src/**/*.d.ts", "src/**/*.svelte", "src/**/*.ts"]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:15:22