我想使用动态组件根据枚举值 Select 视图:

<svelte:component
  this={components[enumValue]}
  {...props}
/>

但如果不传递所有必要的参数,则不会出现编译错误:

<svelte:component
  this={components[enumValue]}
/>

如何正确指定动态组件的类型?


UPD:使用React映射示例

const props: Props = {...}
const components: Record<EnumType, React.FC<Props>> = {
  [EnumType.variant_1]: Component1,
  [EnumType.variant_2]: Component2,
}

推荐答案

您可以使用通用包装器组件应用一点间接寻址.例如.

<!-- 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 丢失错误.

Typescript相关问答推荐

如何根据参数的值缩小函数内的签名范围?

在Angular中,如何在文件上传后清除文件上传文本框

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

Angular中的其他服务仅获取默认值

类型脚本泛型最初推断然后设置

如何重构长联合类型?

Angular 17子路由

类型TTextKey不能用于索引类型 ;TOption

Fp-ts使用任务的最佳方法包装选项

我怎样才能正确地输入这个函数,使它在没有提供正确的参数时出错

try 使Angular依赖注入工作

打字脚本中的模块化或命名空间

我不明白使用打字脚本在模板中展开参考

Rxjs将省略的可观测对象合并到一个数组中

如何在Deno中获取Base64图像的宽/高?

两个名称不同的相同打字界面-如何使其干燥/避免重复?

Select 类型的子项

Typescript泛型验证指定了keyof的所有键

Angular 16:无法覆盖;baseUrl;在tsconfig.app.json中

如何向我的自定义样式组件声明 custom.d.ts ?