typescript - 变量 x 满足接口 A 并且可选地也满足接口 B
问题描述
我有以下声明:
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> = ...
移动 &
如果不是A
andB
我们有SomeLongName
and 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>
推荐阅读
- php - Nginx 下载“下载”文件而不是执行 PHP
- postgresql - zalando postgresql 操作员在故障转移后永远不会恢复
- visual-studio - Visual Studio 错误地插入双波浪号字符
- elasticsearch - 在 Elasticsearch 中使用 scaled_float 可以表示什么范围的数字?
- python - 将嵌套列表从一个字典附加到另一个字典的嵌套列表?
- swift - 从后台返回时,NotificationCenter requestAuthorization 警报无法显示
- shopware - 保存产品时出现 Shopware 6 错误(Method Not Allowed 请求的方法 PATCH 不允许用于此 URL)
- python-3.x - 从 Python 中的字符串打印特定切片
- xml - 用 GTK 创建图形界面最好用什么?
- python - 为什么瓷砖没有出现pygame