typescript - 有区别的联合检查字段的存在吗?
问题描述
我想做的很简单:
我有一个 type Foo
,但在某些情况下 Foo 可能是空的,所以我们有一个带有空对象的联合类型。(这里的用例实际上是使用 Redux,它不允许您将 redux 状态初始化为未定义)。
interface Foo {
id: string;
data: string;
}
type PotentialFoo = Foo | {};
稍后,当我使用其中一个时PotentialFoo
,检查它是否为 Foo 的一种简单方法是检查其中一个字段是否存在。
但是 TypeScript 编译器不喜欢这样。
const itemA: PotentialFoo = {
id: "foo",
data :"data",
}
const itemB: PotentialFoo = {};
function someFunct(item: PotentialFoo) {
if (item.id) { // Property 'id' does not exist on type '{}'.
//handle it as a Foo.
}
}
有没有办法在这里允许歧视,就像 TypeScript 在其他情况下允许的那样?
解决方案
在这种情况下,最简单的解决方案是使用in
检查作为类型保护:
function someFunct(item: PotentialFoo) {
if ('id' in item) {
item.data // ok
}
}
推荐阅读
- html - 图像在 html/css 中过于拉伸
- swift - 从已被点击的 mapView MKAnnotation 中通过 Segue 传递数据
- c++ - 如何在 C++ 中从 UDP 解压无符号字符字节数组
- ruby-on-rails - rails s 的问题(显然是 sass)
- javascript - b-table组件中的所有列都可以启用排序吗?
- c - 为什么调用 sbrk(0) 两次会给出不同的值?
- python - Jenkins 令牌不适用于特定用户
- javascript - 在同一个函数中进行两次调用
- android - 部署 Android 应用程序包时出错
- tinkerpop - 使用属性在顶点之间添加边