如果一种类型扩展了另一种类型,是否可以定义两种类型的联合类型?

时间:2019-08-21 15:17:56

标签: typescript

interface Person {
    firstName: string;
}
interface PersonWithAge extends Person {
    age: number
}
type AnyPerson = Person | PersonWithAge;

let user: AnyPerson = {
    firstName: "Malcolm"
};

user.age = 25;

我收到以下错误:

“类型'人员'不存在属性'年龄'。”

为什么不允许这样做?实现此目标的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您只能访问工会所有组成部分共有的成员。在这种情况下,age仅在PersonWithAge中,因此user.age不是有效的访问权限(因为如果userPerson则没有age )。

您可以使用in类型的防护将联合范围缩小到PersonWithAge

interface Person {
  name: string
}

interface PersonWithAge extends Person {
  age: number;
}

type AnyPerson = Person | PersonWithAge;

declare var user: AnyPerson;
if('age' in user ) {
  user.age // user is PersonWithAge so this is ok now
}

play