打字问题:
给定一个有区别的联合类型
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> = ??????
发布于 2020-09-16 14:14:57
已经定义了Extract预定义类型,它可以执行您想要的操作:
type U = A | B | C;
type Discriminator = U["discriminator"];
type AorB = Extract<U, { discriminator: "A" | "B" }>;
const f = (d:AorB) => d.data;发布于 2020-09-16 14:30:45
事实证明,我已经有了这样做的代码,所以当我再次忘记它时,可以在这里找到答案。
这就是解决方案:
type SubsetOfU<T, K> = T extends { discriminator: K }
? T
: never;发布于 2020-09-16 14:34:19
如果已经为子类型定义了类型,那么实际上不需要使用{ descriminator: 'A' | 'B'},在本例中是A、B和c
type U = A | B | C
type AorB = Extract<U, A | B>
const f = (d: AorB) => d.datahttps://stackoverflow.com/questions/63914112
复制相似问题