【问题标题】:Union type using optional properties使用可选属性的联合类型
【发布时间】:2019-05-13 11:23:44
【问题描述】:

我想使用可选属性而不是属性擦除来获得几种类型的联合。我写了下一段代码:

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&lt;T_AND&gt; &amp; A) | (Partial&lt;T_AND&gt; &amp; B) | (Partial&lt;T_AND&gt; &amp; C)

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

【问题讨论】:

    标签: typescript types


    【解决方案1】:

    您的问题不是源于条件类型的分布,而是源于联合和交集类型的分布。对于打字稿(A | B) &amp; C 等于(A | C) &amp; (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
    

    【讨论】:

    • 你能建议我如何保存 s 字段的可选性吗?因为 Pick 删除了它。
    • @Dem0n13 这很奇怪......我本来希望保留可选性,选择应该这样做..我会尝试找到一个周围..
    • @Dem0n13 这似乎可以完成这项工作:type Result = Partial&lt;T_AND&gt; &amp; (T_OR extends infer T ? T extends any ? Pick&lt;T, keyof T_OR&gt;: never: never); (虽然 intelisense 没有将该属性显示为可选,但它是可选的..)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2017-05-31
    • 2018-08-27
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多