typescript / svelte中的枚举/联合类型

1rhkuytd  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(200)

当我有下面的数据结构时,我有下面的typescript枚举/联合类型的问题

type Options =  SingleOptions | DualDiffOptions
     
    enum Modes {
        Single = "Single",
        DualDiff = "DualDiff",
    }

    type SingleOptions = {
        on_temp: String;
        off_temp: String;
        sensor_channel: String;
    };

    type DualDiffOptions = {
        sensor_cold_side: String;
        sensor_hot_side: String;
        on_temp: String;
        off_temp_diff: String;
    };

    type Data = {
        mode: Mode.Single;
        options: Options;
    };

    let data: Data = {
        mode: Modes.Single,
        options: {
            on_temp: "22",
            off_temp: "23",
            sensor_channel: "ch1",
        },
    };

当我现在使用数据对象时,typescript不能真正弄清楚它是单选项还是双区分选项,如何处理这种情况..?

<div>
            {#if data.mode == Modes.Single}
                <div>
                    {data.options.on_temp}
                </div>
                <div>
                    {data.options.off_temp}
                </div>
                <div>
                    {data.options.sensor_channel}
                </div>
            {/if}
            {#if data.mode == Modes.DualDiff}
                 <div>
                    {data.options.on_temp}
                </div>
                <div>
                    {data.options.off_temp_diff}
                </div>
                <div>
                    {data.options.sensor_cold_side}
                </div>
                <div>
                    {data.options.sensor_hot_side}
                </div>
                
            {/if}
</div>

在rust中,你可以用不同的选项结构体创建一个选项枚举。但是这在 typescript 中似乎是不可能的。
我是打字新手,想学它,因为我有点喜欢类型,现在在学习生 rust 后,但我可以看到打字枚举不是很有用。与生 rust 相比。
一个人怎样处理 typescript 中这种事情呢?
这不工作,因为枚举只接受值而不接受类型

enum Options {
  Single = SingleOptions;
  DualDiff = DualDiffOptions;
}

type Data = {
   mode: Mode.Single;
   options: Options;
 };

let data: Data = {
  mode: Modes.Single,
  options: Options.Single {
    on_temp: "22",
    off_temp: "23",
    sensor_channel: "ch1",
  }
}

问候。

xwbd5t1u

xwbd5t1u1#

您必须显式地将Mode链接到选项的类型,以告诉TypeScript单模式具有单选项,双模式具有双选项。
最简单的方法是使用区分联合

type Data = { mode: Modes.Single, options: SingleOptions }
  | { mode: Modes.DualDiff, options: DualDiffOptions }

对于这段代码,你基本上是说类型Data可以有两种形式,一种是mode等于single,在这种情况下选项应该是SingleOptions的形式,另一种是dual diff

相关问题