我有以下声明:
const x : A | (A & B)
我想知道是否有 & 运算符的“可选”变体,以便我可以更简洁地编写
const x : A &? B
表示 x 肯定满足 A
,但有时也可能满足 B
。
答案 0 :(得分:3)
没有像 A &? B
这样的语法,也没有办法定义语法。我们所拥有的是utility types。
您可以为任何内容定义实用程序类型,但最终可能会包含更多字符,而不仅仅是写出 A | (A & B)
,具体取决于您如何命名。
type WithOptional<Required, Optional> = Required | ( Required & Optional )
const x: WithOptional<A, B> = ...
如果我们有 A
和 B
而不是 SomeLongName
和 SomeOtherLongName
,那么必须突然在 A
中写入两次 A | (A & B)
类型变得更加烦人。 A
存在于联合的两个成员中,因此我们可以将其提取出来并说我们总是有 A
并且还有 B
或没有添加任何内容。
const x: A & (B | {});
const y: SomeLongName & (SomeOtherLongName | {});
评论中有一些关于这种类型的潜在用例的讨论。我对这类事情的用例通常与解构有关,A | (A & B)
不允许对 B
属性进行解构。所以我最终写的是A & Partial<B>
。这表示所有 A
属性都是必需的,所有 B
属性都是可选的。 B
属性可以解构,但可能是 undefined
。
const x: A & Partial<B> = { p1: 0, p2: 0 }
// p1 and p2 are `number`, p3 and p4 are `number | undefined`
const { p1, p2, p3, p4 } = x;
您也可以将此定义用于实用程序类型:
type WithOptional<Required, Optional> = Required & Partial<Optional>