字段存在性的判别并集检查

  • 本文关键字:存在 字段 typescript
  • 更新时间 :
  • 英文 :


我想做的很简单:

我有一个类型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
}
}

播放

一种解决方案是使用TypeScript类型谓词,它本质上是创建一个布尔函数来确定类型,就像您在这里所做的那样,但为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. 
}
}

最新更新