变量 x 满足接口 A 并且可选地也满足接口 B

时间:2021-03-15 09:08:40

标签: typescript typescript-typings

我有以下声明:

const x : A | (A & B)

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

const x : A &? B

表示 x 肯定满足 A,但有时也可能满足 B

1 个答案:

答案 0 :(得分:3)

实用程序类型

没有像 A &? B 这样的语法,也没有办法定义语法。我们所拥有的是utility types

您可以为任何内容定义实用程序类型,但最终可能会包含更多字符,而不仅仅是写出 A | (A & B),具体取决于您如何命名。

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

移动 &

如果我们有 AB 而不是 SomeLongNameSomeOtherLongName,那么必须突然在 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>