Svelte 模板 - Typescript 歧视联盟 - 错误 2322

发布于 2025-01-10 14:58:43 字数 1292 浏览 0 评论 0原文

我有一个 Svelte 模板,它具有基于对象属性的子组件的条件输出。即使对象属性唯一标识对象类型,编译器也会抱怨 ts 2322。

//App.ts
<script lang="ts">
    import type {CheckboxData, LabelData} from 'Types.js';
    import Checkbox from 'Checkbox.svelte';
    import Label from 'Label.svelte';
    
    const tags = (CheckboxData | LabelData)[
                new CheckboxData(), new LabelData()
    ]   
</script>

{#each tags as tag}
    {#if tag.type === "CHECKBOX"}
        <Checbkox data={tag}/> // ts 2322 LabelData is not assignable to CheckboxData
    {:else if tag.type === "LABEL"}
        <Label data={tag}/>
    {/if}
{/each}
//end App.ts

// Types.ts
export class CheckboxData {
    type: "CHECKBOX";
    checked:boolean;
    name:string;
}

export class LabelData {
    type: "LABEL";
    text:string;
    for:string;
}
// end Types.ts

// Checbkox.svelte
<script lang="ts">
    import type {CheckboxData} from 'Types.js';
    export let data:CheckboxData;
</script>

<checkbox checked={data.checked} name={data.name}></checkbox>
// end Checkbox.svelte

// Label.svelte
<script lang="ts">
    import type {LabelData} from 'Types.js';
    export let data:Label;
</script>

<label for={data.for}>{data.text}</label>
// end Label.svelte

I have a Svelte template which has conditional output of subcomponent based on a object property. Even though the object property is uniquely identifying the type of object, the compiler complains with ts 2322.

//App.ts
<script lang="ts">
    import type {CheckboxData, LabelData} from 'Types.js';
    import Checkbox from 'Checkbox.svelte';
    import Label from 'Label.svelte';
    
    const tags = (CheckboxData | LabelData)[
                new CheckboxData(), new LabelData()
    ]   
</script>

{#each tags as tag}
    {#if tag.type === "CHECKBOX"}
        <Checbkox data={tag}/> // ts 2322 LabelData is not assignable to CheckboxData
    {:else if tag.type === "LABEL"}
        <Label data={tag}/>
    {/if}
{/each}
//end App.ts

// Types.ts
export class CheckboxData {
    type: "CHECKBOX";
    checked:boolean;
    name:string;
}

export class LabelData {
    type: "LABEL";
    text:string;
    for:string;
}
// end Types.ts

// Checbkox.svelte
<script lang="ts">
    import type {CheckboxData} from 'Types.js';
    export let data:CheckboxData;
</script>

<checkbox checked={data.checked} name={data.name}></checkbox>
// end Checkbox.svelte

// Label.svelte
<script lang="ts">
    import type {LabelData} from 'Types.js';
    export let data:Label;
</script>

<label for={data.for}>{data.text}</label>
// end Label.svelte

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秋叶绚丽 2025-01-17 14:58:43

我错过了“方程”的字面部分,如果属性定义如下,则歧视有效:

type: "CHECKBOX"

type:string = "CHECKBOX"

I missed the literal part of the "equation", discrimination works if the property is defined like this:

type: "CHECKBOX"

not

type:string = "CHECKBOX"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文