我有以下声明:
const x : A | (A & B)
我想知道是否有一个";可选的";&操作员,这样我就可以更一致地写
const x : A &? B
以表示x肯定满足A
,但有时也可能满足B
。
实用程序类型
没有A &? B
这样的语法,也没有办法定义语法。我们所拥有的是实用程序类型。
你可以为任何东西定义一个实用程序类型,尽管它可能会比只写A | (A & B)
更多的字符,这取决于你如何命名它
type WithOptional<Required, Optional> = Required | ( Required & Optional )
const x: WithOptional<A, B> = ...
移动&
如果我们有SomeLongName
和SomeOtherLongName
而不是A
和B
,那么必须在A | (A & B)
中写入两次A
类型突然变得更加烦人。A
存在于联合的两个成员中,所以我们可以提取它,并说我们总是有A
,也有B
,或者不添加任何内容。
const x: A & (B | {});
const y: SomeLongName & (SomeOtherLongName | {});
部分
评论中对该类型的潜在用例进行了一些讨论。这类事情的用例通常与析构函数有关,而A | (A & B)
不允许析构函数B
属性。所以我最后写的是A & Partial<B>
。这表示所有A
属性都是必需的,所有B
属性都是可选的。CCD_ 19属性可以被破坏,但可能是CCD_。
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>