【问题标题】:Get a subset of a discriminated union based on a subset of the discriminator根据判别器的子集获取判别联合的子集
【发布时间】:2020-09-16 14:34:18
【问题描述】:

打字稿问题:

给定一个可区分的联合类型

interface A {
    discriminator: "A";
    data: string;
}

interface B {
    discriminator: "B";
    data: string;
}

interface C {
    discriminator: "C";
    num: number;
}

type U = A | B | C;
type Discriminator = U["discriminator"];

type AorB = SubsetOfU<"A"|"B">;

const f = (d:AorB) => d.data; // Should work

如何编写SubsetOfU 来提取联合类型的子集?

当然,我不是在解决这里的具体案例(只是A|B),而是一个更复杂的场景。

type SubsetOfU&lt;K extends Discriminator&gt; = ??????

【问题讨论】:

标签: typescript


【解决方案1】:

Extract 预定义类型已经定义并且可以执行您想要的操作:

type U = A | B | C;
type Discriminator = U["discriminator"];

type AorB = Extract<U, { discriminator: "A" | "B" }>;

const f = (d:AorB) => d.data;

Playground Link

【讨论】:

    【解决方案2】:

    原来我已经有执行此操作的代码,所以当我再次忘记它时,我可以在这里找到答案。

    这是解决方案:

    type SubsetOfU<T, K> = T extends { discriminator: K }
      ? T
      : never;
    

    【讨论】:

      【解决方案3】:

      如果您为子类型定义了类型,则实际上不需要使用 { descriminator: 'A' | 'B'},在您的情况下为ABc

      type U = A | B | C
      type AorB = Extract<U, A | B>
      
      const f = (d: AorB) => d.data
      

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 1970-01-01
        • 2018-07-31
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 2014-06-23
        • 1970-01-01
        相关资源
        最近更新 更多