变量 x 满足接口 A 并且可选地还满足接口 B
variable x satisfies interface A and optionally also staisfies interface B
我有以下声明:
const x : A | (A & B)
我想知道是否有 & 运算符的“可选”变体,以便我可以更方便地编写
const x : A &? B
表示x肯定满足A
,但有时也可能B
.
实用程序类型
没有A &? B
这样的语法,也无法定义语法。我们所拥有的是 utility types.
您可以为任何东西定义一个实用程序类型,尽管它最终可能会比写出更多字符 A | (A & B)
,具体取决于您如何命名它。
type WithOptional<Required, Optional> = Required | ( Required & Optional )
const x: WithOptional<A, B> = ...
移动 &
如果我们有 SomeLongName
和 SomeOtherLongName
而不是 A
和 B
,那么必须在 [=16= 中写两次 A
类型】 一下子就烦了很多。 A
存在于 union 的两个成员中,所以我们可以将其提取出来并说我们总是有 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>
我有以下声明:
const x : A | (A & B)
我想知道是否有 & 运算符的“可选”变体,以便我可以更方便地编写
const x : A &? B
表示x肯定满足A
,但有时也可能B
.
实用程序类型
没有A &? B
这样的语法,也无法定义语法。我们所拥有的是 utility types.
您可以为任何东西定义一个实用程序类型,尽管它最终可能会比写出更多字符 A | (A & B)
,具体取决于您如何命名它。
type WithOptional<Required, Optional> = Required | ( Required & Optional )
const x: WithOptional<A, B> = ...
移动 &
如果我们有 SomeLongName
和 SomeOtherLongName
而不是 A
和 B
,那么必须在 [=16= 中写两次 A
类型】 一下子就烦了很多。 A
存在于 union 的两个成员中,所以我们可以将其提取出来并说我们总是有 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>