我想使用可选属性代替属性擦除来获得多种类型的并集。我写了下一个代码:
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)
。
如何防止这种行为并获得预期的结果?
答案 0 :(得分:1)
您的问题不是源于条件类型的分布,而是源于联合和交叉类型的分布。对于打字稿(A | B) & C
等于(A | C) & (B | C)
结果也不是您所期望的,因为如果您将一个可选属性与一个非可选属性相交,则结果将是必选属性。
您可以通过使用Pick
从T_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