首页 > 解决方案 > 变量 x 满足接口 A 并且可选地也满足接口 B

问题描述

我有以下声明:

const x : A | (A & B)

我想知道 & 运算符是否有“可选”变体,以便我可以更简洁地编写

const x : A &? B

表示 x 绝对满足A,但也可能有时B

标签: typescripttypescript-typings

解决方案


实用程序类型

没有语法,A &? B也没有办法定义语法。我们所拥有的是实用程序类型

你可以为任何东西定义一个实用程序类型,尽管它可能会比写出更多的字符结束A | (A & B),这取决于你如何命名它。

type WithOptional<Required, Optional> = Required | ( Required & Optional )
const x: WithOptional<A, B> = ...

移动 &

如果不是AandB我们有SomeLongNameand 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>

推荐阅读