您可以使用通用包装器组件应用一点间接寻址.例如.
<!-- renderer.svelte -->
<script lang="ts">
import type { SvelteComponentTyped } from 'svelte/internal';
type C = $$Generic<typeof SvelteComponentTyped<any, any, any>>;
export let component: C;
export let props: C extends typeof SvelteComponentTyped<infer P> ? P : never;
</script>
<svelte:component this={component} {...props} />
用法示例:
<!-- adder.svelte -->
<script lang="ts">
export let a: number;
export let b: number;
</script>
{a} + {b} = {a + b}
<script lang="ts">
import Renderer from './renderer.svelte';
import Adder from './adder.svelte';
</script>
<Renderer component={Adder} />
<!-- Error on "Renderer" because props are missing -->
<Renderer component={Adder} props={{ a: 12 }} />
<!-- Error on "props": Property 'b' is missing in type '{ a: number; }'
but required in type '{ a: number; b: number; }' -->
这可能需要最新版本的svelte
/svelte-preprocess
才能正确使用泛型.您还可以删除泛型并更松散地键入渲染器的属性.将props
作为另一个组件的导出至少可以确保props 丢失错误.