typescript - 是否可以使用可选链接来缩小联合类型的范围?
问题描述
我有一个有区别的 union,简化为这个例子。
type FoobarEvent = FooEvent | BarEvent;
interface FooEvent {
type: 'foo';
foo: {
name: string;
}
}
interface BarEvent {
type: 'bar';
bar: {
id: string;
}
}
当然,我可以检查判别式并正确缩小联合类型。
// let's assume this exists
declare const foobarEvent: FoobarEvent;
let fooName: string | undefined;
if (foobarEvent.type === 'foo') {
fooName = foobarEvent.foo.name;
}
但是我想避免这个 if 块,所以我尝试使用可选链接来缩小类型,但这不起作用,因为其中一个联合没有我试图访问的字段。
const fooNameByChaining = foobarEvent.foo?.name;
“FoobarEvent”类型上不存在属性“foo”。
“BarEvent”类型上不存在属性“foo”。
因此,显然缩小需要在可选链接之前发生。这是 TypeScript 类型系统的限制,还是可以将其作为一项功能添加到 TypeScript 中?还是有另一种我不知道的解决方法?
解决方案
如果 TypeScript 允许您附加.foo?.name
任何类型,那么每当我们使用?.
运算符时,它都会使类型检查失败。
例如,是 myfoobarEvent
的一种类型,其中foo
是可选属性:
type FoobarEvent = {
id: number;
bar: string;
foo?: {
name: string;
}
}
在这种情况下,我的意图是正确的:
const name = foobarEvent.foo?.name;
或者 - 我是否通过添加.foo?.name
错误的类型来创建错字?
const name = localStorage.foo?.name;
推荐阅读
- django - django模板中的条件语句
- angular - 如何从外部调用触发流
- javascript - 如何使用 JS 在 MS CRM 中使用“Xrm.WebApi.execute”方法执行“汇总”请求
- loopback - 授权权限
- python - 重塑 Pandas 列以显示图像
- git - Visual Studio GIT 重置为以前的提交问题
- sql-server - 使用 SQL 身份验证时 SSIS 批量插入错误
- ios - 具有后台进程的领域实例丢失数据
- ios - cellForItemAt called only once in Swift collectionView
- excel - 无法在 Excel 中定义对象