在打字稿中定义集合的至少1个属性

时间:2020-09-03 22:11:00

标签: typescript

我看到您可以在TS中做这样的互斥属性

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

但是我如何创建一个至少有1个但没有两个的类型。而且不用太冗长...

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

这样做吗?有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以创建一个通用类型,以要求至少一个这样的属性:

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 :(得分:0)

这不会这样做,因为例如 Month Year Product Name Total 0 1 2018 Creatine 21000 1 1 2018 Glucosamine 37000 2 11 2017 Creatine 41000 3 11 2017 Glucosamine 40000 4 12 2017 Creatine 17000 5 12 2017 Glucosamine 31500 Month Year Quantity Sold Product Name 1 11 2017 10 "Gummies 1 bag" 11 1 2018 10 "Gummies 1 bag" 可分配给您的第二个A,而不是第一个,因此它们不是同一类型。

Does Typescript support mutually exclusive types?被接受的答案定义了XOR类型,我想如果愿意的话,也许用'undefined'代替Without类型中的'never'

{ a: "common", m: 1, n: 2 }

您有想要的东西

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