受歧视的工会检查是否存在田地?

时间:2019-10-23 04:30:01

标签: typescript

我想做的很简单:

我的类型为Foo,但是在某些情况下Foo可能为空,因此我们有一个带有空对象的联合类型。 (这里的用例实际上是Redux,它不允许您将Redux状态初始化为undefined)。

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一样?

2 个答案:

答案 0 :(得分:2)

一种解决方案是使用TypeScript type predicate,这实际上是创建一个布尔函数来确定类型,就像您在此处使用的那样,但是可以为TypeScript提供更好的编译器提示。

const itemA: PotentialFoo = {
    id: "foo", 
    data :"data", 
}

const itemB: PotentialFoo = {}; 

function isFoo(item: PotentialFoo) : item is Foo {
    return !!(item as Foo).id; 
}


function someFunct(item: PotentialFoo) {
    if (isFoo(item)) {
        //handle it as a Foo. 
    }
}

答案 1 :(得分:1)

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


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

        item.data // ok
    }
}

Play