首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于鉴别器的子集获取区分并的子集

基于鉴别器的子集获取区分并的子集
EN

Stack Overflow用户
提问于 2020-09-16 14:11:25
回答 3查看 358关注 0票数 4

打字问题:

给定一个有区别的联合类型

代码语言:javascript
复制
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<K extends Discriminator> = ??????

EN

回答 3

Stack Overflow用户

发布于 2020-09-16 14:14:57

已经定义了Extract预定义类型,它可以执行您想要的操作:

代码语言:javascript
复制
type U = A | B | C;
type Discriminator = U["discriminator"];

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

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

Playground Link

票数 7
EN

Stack Overflow用户

发布于 2020-09-16 14:30:45

事实证明,我已经有了这样做的代码,所以当我再次忘记它时,可以在这里找到答案。

这就是解决方案:

代码语言:javascript
复制
type SubsetOfU<T, K> = T extends { discriminator: K }
  ? T
  : never;
票数 1
EN

Stack Overflow用户

发布于 2020-09-16 14:34:19

如果已经为子类型定义了类型,那么实际上不需要使用{ descriminator: 'A' | 'B'},在本例中是ABc

代码语言:javascript
复制
type U = A | B | C
type AorB = Extract<U, A | B>

const f = (d: AorB) => d.data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63914112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档