代码之家  ›  专栏  ›  技术社区  ›  Thomas

在typescript中定义集合的至少一个属性

  •  0
  • Thomas  · 技术社区  · 5 年前

    我知道你可以在TS中做这样的互斥性质

    type A =
      | { a: "common"; m: any; n: undefined }
      | { a: "common"; m: undefined; n: any };
    

    但是如何创建一个至少有1个,但不是两者都有的类型。不用说太多了。。。

    type A = {a: "common"} & ({m: any} | {n: any});
    

    这样行吗?有更好的办法吗?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Teneff    5 年前

    您可以创建泛型类型以要求至少一个如下属性:

    type AtLeastOne<T, U extends keyof T = keyof T> = {
        [K in U]-?: Required<Pick<T, K>> & Partial<Omit<T, K>>
    }[U]
    

    然后定义你的 A 像这样打字

    type A = { a: "common" } & AtLeastOne<{
      m: any;
      n: any;
    }>;
    

    example

        2
  •  1
  •   Rubydesic    5 年前
    type Combine<A, B> = A | B | A & B
    type A = { a: "common" } & Combine<{ m: any }, { n: any }>
    
        3
  •  0
  •   Countingstuff    5 年前

    那不行,因为举例来说 { a: "common", m: 1, n: 2 } 可分配给第二个A,但不是第一个,所以它们不是同一类型。

    公认的答案 Does Typescript support mutually exclusive types? 定义一个XOR类型,我想如果你喜欢的话,可以用undefined替换Without类型中的never

    type A = { a: "common" } & XOR<{ m: any }, { n: any }>
    

    编辑-哦,我误读了你的问题。

    推荐文章