打字稿:对联合类型字段的约束

Typescript: Constraint on a field of an union type

我创建了一个联合类型的对象。它们都有一个字段 role 来区分它们。 这里我们有老师学生:

type User =
    {
        role: "student";
        followClasses: string[];
    } |
    {
        role: "teacher";
        since: number;
    };

然后我想创建一个函数来生成一个默认学生:

const defaultStudent = (): User => ({
    role: "student",
    followClasses: [],
});

但是由于return类型是联合类型User,打字稿不知道这是一个学生当我输入这个时给我一个警告

const student = defaultStudent();

console.log(student.followClasses);
//          Warning here ⮥

如何使函数 defaultStudent 具有约束 return 类型(学生)?

将联合的两个成员提取为单独的类型

type Student = {
  role: "student"
  followClasses: string[]
}

type Teacher = {
  role: "teacher"
  since: number
}

并直接从他们定义你的联合

type User = Student | Teacher

在这一点上,你可以说你的defaultStudent函数不只是return一个User,你可以比这更精确。它 return 是 Student

const defaultStudent = (): Student => ({
  role: "student",
  followClasses: [],
})

const student = defaultStudent()
console.log(student.followClasses) // <-- OK