我想做的很简单:
我的类型为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一样?
答案 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
}
}