首页 > 解决方案 > 有区别的联合检查字段的存在吗?

问题描述

我想做的很简单:

我有一个 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 在其他情况下允许的那样?

标签: typescript

解决方案


在这种情况下,最简单的解决方案是使用in检查作为类型保护:


function someFunct(item: PotentialFoo) {
    if ('id' in item) {

        item.data // ok
    }
}


推荐阅读