使用可选属性的联合类型

时间:2018-12-12 11:03:30

标签: typescript types

我想使用可选属性代替属性擦除来获得多种类型的并集。我写了下一个代码:

type A = { a: string, s: number };
type B = { b: string, s: number };
type C = { c: string, s: number };

type T_OR = A | B | C; // s
type T_AND = A & B & C; // a, b, c, s
type Result = Partial<T_AND> & T_OR; // a, b, c, s

我希望Result类型将包含// a?, b?, c?, s字段,但是Typescript使用分布式条件类型并将Result转换为(Partial<T_AND> & A) | (Partial<T_AND> & B) | (Partial<T_AND> & C)

如何防止这种行为并获得预期的结果?

1 个答案:

答案 0 :(得分:1)

您的问题不是源于条件类型的分布,而是源于联合和交叉类型的分布。对于打字稿(A | B) & C等于(A | C) & (B | C)

结果也不是您所期望的,因为如果您将一个可选属性与一个非可选属性相交,则结果将是必选属性。

您可以通过使用PickT_OR中选择适当的键来获得所需的结果,即仅在联合体上公开可见的键:

type A = { a: string, s: number };
type B = { b: string, s: number };
type C = { c: string, s: number };

type T_OR = A | B | C; // s
type T_AND = A & B & C; // a, b, c, s
type Result = Partial<T_AND> & Pick<T_OR, keyof T_OR>; // a?, b?, c?, s